我有以下df
> structure(f)
p c at cu z m A ps dc w al W b t s u re fs1 fs2 uc
1 21 7 12 43 1 0.5 10 22.3 5 5 8 NA 0.782 NA NA NA NA NA NA NA
和另一个包含表达式/公式的df来计算f
中的NA值> structure(formulas)
W t
2 p*z*al p*z*sin(b)
s u re
2 p*z*cos(b) m*ps*z c+((s-u)*tan(at)
f可能有多行,所以我只想将每个公式应用于每列的所有行。 例如,为了计算W,我可以尝试
f$W=f$p*f$z*f$al
但是我想知道是否有办法自动化所有这些。我想转换公式中的表达式,然后应用它们来计算f中的相应变量。在评估表达式时,有没有办法在df中引用列而不重复df $? 我知道我可以使用eval(parse(text =“formula [1,1]”))将我的字符串转换为表达式,但在这里我正在处理整个df列。
答案 0 :(得分:3)
编辑,感谢Frank,事实证明这种方法不必要地复杂化,因为eval
可以采用envir
- 参数。
dat <- data.frame(a=1:5,b=5:1)
因此,我们可以制作这样的公式:
formulas = quote(data.frame(a_plus_b = a+b, a_min_b = a-b))
评估很容易:
out <- cbind(dat, eval(formulas, dat))
> out
a b a_plus_b a_min_b
1 1 5 6 -4
2 2 4 6 -2
3 3 3 6 0
4 4 2 6 2
5 5 1 6 4
使用字符串的旧方法:
formulas <- data.frame(a_plus_b="a+b",
a_min_b = "a-b",stringsAsFactors=F)
out <- cbind(dat,lapply(formulas, function(x){with(dat, eval(parse(text=x)))}))
答案 1 :(得分:0)
这是我对data.table
方式的看法。可能也可以摆脱for循环。但不知何故,它对我不起作用。如果我找到方法,将会更新。
df <- data.table(x = rnorm(10), y = rnorm(10), z = NA, w = NA)
df2 <- data.table(x = NA, y = NA, z = "cos(x) + sin(y)", w = "x * y")
varnames <- colnames(df2)[!sapply(df2[1,], is.na)]
for(i in varnames){
df[,c(i) := with(df, eval(parse(text = with(df2, get(i)))))]
}
答案 2 :(得分:0)
dplyr
方式:
require(dplyr)
f <- f %>% mutate(W = p*z*al, t = p*z*sin(b), s = p*z*cos(b),
u = m*ps*z, re = c+((s-u)*tan(at))