Это на самом деле то, что называется векторизацией функции, и это может значительно повысить производительность вашего кода.
Но сначала, просто чтобы вы знали о будущих вопросах, гораздо проще предоставить пример данных, используя dput
dput(df)
Тогда тот, кто хочет ответить на вопрос, может просто использовать вывод:
df <- dget(structure(list(word = structure(c(2L, 5L, 6L, 1L, 3L, 4L), .Label = c("baseball",
"car", "color", "muscle", "saturn", "survival"), class = "factor"),
Occ_1 = c(0L, 2L, 1L, 1L, 0L, 0L), Occ_2 = c(1L, 0L, 2L,
1L, 0L, 1L), Occ_3 = c(0L, 2L, 0L, 0L, 1L, 0L), Totl_1 = c(11L,
11L, 11L, 11L, 11L, 11L), Totl_2 = c(9L, 9L, 9L, 9L, 9L,
9L), Totl_3 = c(7L, 7L, 7L, 7L, 7L, 7L), Unique_words = c(17L,
17L, 17L, 17L, 17L, 17L), Probability_1 = c(0.0357142857142857,
0.107142857142857, 0.0714285714285714, 0.0714285714285714,
0.0357142857142857, 0.0357142857142857), Probability_2 = c(0.0769230769230769,
0.0384615384615385, 0.115384615384615, 0.0769230769230769,
0.0384615384615385, 0.0769230769230769), Probability_3 = c(0.0416666666666667,
0.125, 0.0416666666666667, 0.0416666666666667, 0.0833333333333333,
0.0416666666666667)), row.names = c(NA, -6L), class = "data.frame"))
В любом случае, вот способ сделать то, что вы хотите:
df$Probability_1 <- (df$Occ_1 + 1) / (df$Totl_1 + df$Unique_words)
df$Probability_2 <- (df$Occ_2 + 1) / (df$Totl_2 + df$Unique_words)
df$Probability_3 <- (df$Occ_3 + 1) / (df$Totl_3 + df$Unique_words)
Или, если вы предпочитаете, dplyr
:
library("dplyr")
df_new <- df %>%
mutate(
Probability_1 = (Occ_1 + 1) / (Totl_1 + Unique_words),
Probability_2 = (Occ_2 + 1) / (Totl_2 + Unique_words),
Probability_3 = (Occ_3 + 1) / (Totl_3 + Unique_words)
)
Обновление
Я упустил суть вопроса. На самом деле речь идет о количестве Occ
и Totl
переменных. Я бы решил это с помощью цикла for, который все еще должен быть очень эффективным:
for(i in gsub("^Occ_", "", grep("^Occ_*", colnames(df), value = TRUE))) {
df[paste0("Probability_", i)] <-
(df[paste0("Occ_", i)] + 1) / (df[paste0("Totl_", i)] + df$Unique_words)
}