【发布时间】:2012-02-01 11:05:53
【问题描述】:
考虑以下示例
df1 <- data.frame(a=c(1,2,3),b=c(2,4,6));
transform(df1,c=a+b)
a b c
1 1 2 3
2 2 4 6
3 3 6 9
到目前为止,一切都很好。现在我想使用 as.formula 动态编码:
transform(df1,as.formula("c=a+b"))
但是,R 说
Error in eval(expr, envir, enclos) : object 'b' not found
使用“~”作为左右分隔符不会发生此错误。我可以以某种方式延迟公式的评估吗?是否可以在作业中使用 as.formula ?我试过摆弄'with'但无济于事。
【问题讨论】:
-
我认为您希望他们成为
expressions 而不是公式。然而,看起来你最终会在eval(parse(text="whatever"))上得到一些变化,这将导致可怕的、可怕的代码和难以找到的错误。如果可能,尝试做一些不那么聪明的事情。 -
最好用等号分割你的字符串。在左侧,您可以使用
df1[["c"]] <- something之类的内容。从"a+b"到在df1中进行评估意味着eval(parse(text = "a+b"), df1)或同样丑陋的东西。我建议您告诉我们更多关于您想要实现的目标,以便我们帮助您考虑替代方案。 -
在我真正的问题中,自动执行它也不是很重要。我只有大约 50 列,名称属于“X[XOY][ABC]_[0-9][0-9]”类别,例如“XXA_05”。现在我想对所有具有相同“X[XOY]”类型和相同数字的列进行平均,例如“XXA_00”和“XXB_00”,并将其保存到这些列的第一列。当然,这也可以通过 grepping 正确的列在列级别上完成。我只是偶然发现了公式问题,想知道是否有可能将其实现为公式。
-
不要使用转换。它是一个适合交互使用的辅助函数,而不是用于编程。
-
您能详细说明一下吗?所以我应该使用例如 df[[col1]]