Ответ 1
Существует множество способов, которыми это можно сделать. Проблема заключается в том, как сделать R осведомленным о местах переменных, которые вы хотите разделить.
Полагая
d <- read.table(text = "263807.0 1582
196190.5 1016
586689.0 3479
")
names(d) <- c("min", "count2.freq")
> d
min count2.freq
1 263807.0 1582
2 196190.5 1016
3 586689.0 3479
Мой предпочтительный способ
Чтобы добавить желаемое деление в качестве третьей переменной, я бы использовал transform()
> d <- transform(d, new = min / count2.freq)
> d
min count2.freq new
1 263807.0 1582 166.7554
2 196190.5 1016 193.1009
3 586689.0 3479 168.6373
Основной путь R
Если это делается в функции (т.е. вы программируете), лучше всего избегать показанного выше сахара и индекса. В этом случае любой из них сделает то, что вы хотите
## 1. via `[` and character indexes
d[, "new"] <- d[, "min"] / d[, "count2.freq"]
## 2. via `[` with numeric indices
d[, 3] <- d[, 1] / d[, 2]
## 3. via `$`
d$new <- d$min / d$count2.freq
Все они также могут использоваться в подсказке, но которые легче читать:
d <- transform(d, new = min / count2.freq)
или
d$new <- d$min / d$count2.freq ## or any of the above examples
Надеюсь, вы думаете, что я делаю, и первая версия лучше; -)
Причина, по которой мы не используем синтаксический сахар tranform()
et al, когда программирование связано с тем, как они выполняют свою оценку (ищите именованные переменные). На верхнем уровне (в подсказке, работая в интерактивном режиме) transform()
и другие работают просто отлично. Но похоронен в функциональных вызовах или в вызове одному из семейств функций apply()
, которые они могут и часто прерывают.
Аналогично, будьте осторожны с использованием числовых индексов (## 2.
выше); если вы измените порядок своих данных, вы выберете неправильные переменные.
Предпочтительный вариант, если вам не нужна замена
Если вы просто хотите сделать деление (вместо того, чтобы вставить результат обратно в фрейм данных, используйте with()
, что позволяет нам изолировать простое выражение, которое вы хотите оценить
> with(d, min / count2.freq)
[1] 166.7554 193.1009 168.6373
Это намного более чистый код, чем эквивалентный
> d$min / d$count2.freq
[1] 166.7554 193.1009 168.6373
поскольку он явно заявляет, что "используя d
, выполните код min / count2.freq
. Ваши предпочтения могут отличаться от моих, поэтому я показал все параметры.