Это зависит от того, какая эффективность вы хотите - это вычислительная эффективность (время вычислений) или эффективность программирования (количество используемых строк)
С точки зрения эффективности программирования будет очень трудно победить data.table
решение. Я могу предложить вам следующее:
prac <- data.frame(`External Placement` = c(NA, NA, "Spanish words We place outside of our company", NA, NA, "Spanish words We place outside of our company", "Spanish words We place outside of our company", "Spanish words We place outside of our company", NA, "Spanish words We place outside of our company"),
`Internal Placement` = c(NA, NA, "Spanish words we place inside of our organisation", NA, "Spanish words we place inside of our organisation", "Spanish words we place inside of our organisation", NA, NA, NA, NA),
`None of the Above` = c("Ninguno none", "Ninguno none", NA, NA, NA, NA, NA, NA, NA, NA))
library(data.table)
list_conditions <- c(#"Vocational.Training" = "vocational training$",
"External.Placement" = "outside of our company$",
"Internal.Placement" = "inside our organisation$",
"None.of.the.Above" = "^Ninguno")
dt <- data.table(prac)
Моя идея состоит в том, чтобы использовать вектор с условиями, имена которых являются той переменной, для которой он должен применяться. Затем lapply
, который обновляет ваш фрейм данных по ссылке (здесь вы теряете некоторую эффективность программирования, но у вас будет очень хорошая вычислительная эффективность)
dt <- lapply(seq_len(length(list_conditions)), function(i) {
var <- names(list_conditions)[i]
cond <- list_conditions[i]
val <- gsub("\\.","", var)
dt[, 'tempcol' := NA_character_]
dt[grepl(as.character(cond), get(var)), tempcol := as.character(val)]
dt[,c(var) := tempcol]
})
dt <- dt[[length(dt)]]
dt[,'tempcol' := NULL]
Строка dt <- dt[[length(dt)]]
здесь, потому что R возвращает список, но мы интересует только его последний элемент (последнее обновление для фрейма данных). Вы можете обобщить эту программу, если предпочитаете создавать новые столбцы, а не переписывать существующие.
Вывод:
dt
External.Placement Internal.Placement None.of.the.Above
1: <NA> <NA> None of the Above
2: <NA> <NA> None of the Above
3: External Placement <NA> <NA>
4: <NA> <NA> <NA>
5: <NA> <NA> <NA>
6: External Placement <NA> <NA>
7: External Placement <NA> <NA>
8: External Placement <NA> <NA>
9: <NA> <NA> <NA>
10: External Placement <NA> <NA>