Что вам нужно, так это «подсчитать по группам» - сгруппировать по old_col
и посчитать количество строк с этим значением old_col
.
Это очень распространенная операция, и пакеты манипулирования данными позволяют легко это сделать. Мой личный выбор пакета данных - data.table
, где ваша операция может быть выражена как:
library(data.table)
setDT(df) # convert to data.table to 'unlock' the correct syntax
df[ , new_col := .N, by = old_col]
С вашими данными:
df = data.frame(old_col = c(1, 1:3), name = letters[1:4])
выход:
old_col name new_col
1: 1 a 2
2: 1 b 2
3: 2 c 1
4: 3 d 1
Если вы вынуждены сделать это с помощью цикла for
, я настоятельно рекомендую не использовать 1:nrow(df)
. Вероятно, наиболее эффективным способом является использование table
:
counts = as.data.frame(table(old_col = df$old_col))
for (ii in 1:nrow(counts)) {
df$new_col[df$old_col == counts$old_col[ii]] = counts$Freq[ii]
}
Это позволяет избежать повторного подсчета количества строк - представьте, что в old_col
у вас было 1 000 000 повторений 1
. Вы не хотели бы считать до 1,000,000
миллиона раз (один раз для каждого появления 1
); лучше посчитать 1 000 000 только один раз.