gpt4 book ai didi

r - 将一组函数应用于对象

转载 作者:行者123 更新时间:2023-12-04 02:20:29 27 4
gpt4 key购买 nike

我有一个带有一组对象的数据框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 的东西-函数和一个 post关于将许多函数应用于向量以及关于 chaining functions 的内容. Compose这个想法看起来很有希望,但我不知道如何调用 Compose以我的规则为字符串。 ( parse() 没用..)

有什么提示吗?

最佳答案

已经有一些很好的答案,但还有另一种选择——将管道链构建为字符串,然后对其进行评估。例如 - 对于第 1 行 - eval(parse(text = "1 %>% rule1"))给 2

eval_chain <- function(df) {
eval(parse(text = paste(c(df$data, unlist(strsplit(df$rules, ", "))), collapse=" %>% ")))
}

df$value <- sapply(1:nrow(df), function(i) df[i, ] %>% eval_chain)
# data rules value
# 1 1 rule1 2
# 2 2 rule1, rule2, rule3 125
# 3 3 rule3, rule2 28

关于r - 将一组函数应用于对象,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/50391104/

27 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com