使用字符串作为语法将变量添加到data.frame

时间:2014-01-07 17:26:53

标签: r dataframe

我有这个变量:

data <- data.frame(x=rnorm(10), y=rnorm(10))
form <- 'z = x*y'

如何计算z(使用data的变量)并将其作为新变量添加到data

我尝试使用parse()eval()(基于old question),但没有成功:/

2 个答案:

答案 0 :(得分:4)

鉴于@Nico所说的是正确的,你可能会这样做:

d1 <- within(data, eval(parse(text=form)) )
d1
            x           y           z
1   0.5939462  1.58683345  0.94249368
2   0.3329504  0.55848643  0.18594826
3   1.0630998 -1.27659221 -1.35714497
4  -0.3041839 -0.57326541  0.17437812
5   0.3700188 -1.22461261 -0.45312970
6   0.2670988 -0.47340064 -0.12644474
7  -0.5425200 -0.62036668  0.33656135
8   1.2078678  0.04211587  0.05087041
9   1.1604026 -0.91092165 -1.05703586
10  0.7002136  0.15802877  0.11065390

答案 1 :(得分:0)

transform()是交互式使用的简便方法:

data <- data.frame(x=rnorm(10), y=rnorm(10))

data <- transform(data, z = x * y)

R> head(data)
        x        y        z
1 -1.0206  0.29982 -0.30599
2 -1.6985  1.51784 -2.57805
3  0.8940  1.19893  1.07187
4 -0.3672 -0.04008  0.01472
5  0.5266 -0.29205 -0.15381
6  0.2545 -0.26889 -0.06842

你不能使用form执行此操作,但是within(),类似于transform() 允许这样做,例如

R> within(data, eval(parse(text = form)))
         x        y         z
1  -0.8833 -0.05256  0.046428
2   1.6673  1.61101  2.686115
3   1.1261  0.16025  0.180453
4   0.9726 -1.32975 -1.293266
5  -1.6220 -0.51079  0.828473
6  -1.1981  2.62663 -3.147073
7  -0.3596 -0.01506  0.005416
8  -0.9700  0.21865 -0.212079
9   1.0626  1.30377  1.385399
10 -0.8020 -1.04639  0.839212
虽然它涉及一些jiggery-pokery与我认为不优雅的语言。实际上,你正在做这样的事情:

R> eval(eval(parse(text = form), data), data, parent.frame())
 [1]  0.046428  2.686115  0.180453 -1.293266  0.828473 -3.147073  0.005416
 [8] -0.212079  1.385399  0.839212

(并将结果分配给data中的指定组件。)

form是否必须像这样,作为表示要评估的表达式的字符串?