У меня есть фрейм данных с набором объектов df$data
и набором правил, которые должны применяться к каждому объекту df$rules
.
df <- data.frame(
data = c(1,2,3),
rules = c("rule1", "rule1, rule2, rule3", "rule3, rule2"),
stringsAsFactors = FALSE
)
Правила
rule1 <- function(data) {
data * 2
}
rule2 <- function(data) {
data + 1
}
rule3 <- function(data) {
data ^ 3
}
Для каждой строки в фрейме данных я хочу применить все правила, указанные в столбце rules
. Правила должны применяться последовательно.
Что я понял:
apply_rules <- function(data, rules) {
for (i in 1:length(data)) {
rules_now <- unlist(strsplit(rules[i], ", "))
for (j in 1:length(rules_now)) {
data[i] <- apply_rule(data[i], rules_now[j])
}
}
return(data)
}
apply_rule <- function(data, rule) {
return(sapply(data, rule))
}
apply_rules(df$data, df$rules)
# [1] 2 125 28
Хотя это работает, я уверен, что должны быть более элегантные решения. На SO я мог найти много материала о apply
-функциях, а также один пост о применении многих функций к вектору и кое-что о функциях цепочки . Идея Compose
выглядит многообещающе, но я не мог понять, как позвонить на Compose
с моими правилами в виде строки. (parse()
не работает ..)
Есть подсказки?