如何转换R公式列以包含数据框规范?例如,我有一个包含数百个公式的列,但它们不包含任何数据框规范,例如:
365/(x/y)
365/(x/(y + z))
365/(x/ (y - z))
c + d + e + f
我希望将整个列转换为:
365/(r$x/r$y)
365/(r$x/(r$y + r$z))
365/(r$x/ (r$y - r$z))
r$c + r$d + r$e + r$f
所以我基本上想要为运算符分隔的每个文本组添加一个前缀(r $)。这可以在R吗?
答案 0 :(得分:3)
更好的方法是直接提供数据帧,例如
lm(y ~ x, data=myframe)
尽可能多的建模函数支持data=
参数。
或者,您可以使用with
和within
函数
with(myframe, summary( 365/(x/y) ) )
,提供对数据框myframe
的组件的访问,而无需前缀。
答案 1 :(得分:2)
通常的做法是在with()
中包装公式(或更准确地说是表达式)。如果要生成结果向量,则需要eval() - 在with
“闭包”创建的环境的上下文中使用每个表达式。
expr <- expression(365/(x/y),
365/(x/(y + z)),
365/(x/ (y - z)),
c + d + e + f)
dat <- data.frame(x=sample(1:100, 10),
y=sample(1:100, 10),
z=sample(1:100, 10),
c=sample(1:100, 10),
d=sample(1:100, 10),
e=sample(1:100, 10),
f=sample(1:100, 10))
sapply(expr, function(ep) with(dat, eval(ep)))
[,1] [,2] [,3] [,4]
[1,] 121.66667 1155.8333 -912.50000 168
[2,] 4197.50000 4471.2500 3923.75000 131
[3,] 290.00000 620.0000 -40.00000 219
[4,] 60.83333 3224.1667 -3102.50000 245
[5,] 6752.50000 24637.5000 -11132.50000 229
[6,] 4901.42857 7456.4286 2346.42857 239
[7,] 127.75000 246.3750 9.12500 177
[8,] 355.64103 1179.2308 -467.94872 142
[9,] 500.18519 959.8148 40.55556 161
[10,] 299.48718 444.5513 154.42308 194