如何在long表达式中引用数据帧内的许多变量

时间:2016-02-12 12:49:11

标签: r expression

我有以下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列。

3 个答案:

答案 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))