【问题标题】:as.formula does not like equivalence '=' (object not found)as.formula 不喜欢等价 '='(找不到对象)
【发布时间】: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"]] &lt;- 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]]

标签: r dataframe formula


【解决方案1】:

我已经解决了您在评论中提到的问题,因为这似乎是您的真正目标。这样可以避免弄乱原始问题中的公式。

数据集的可重现版本。

group_names <- apply(
    expand.grid("X", c("X", "O", "Y"), c("A", "B", "C"), "_", 0:9, 0:9),
    1,
    paste,
    collapse = ""
)
n_groups <- 50
n_points_per_group <- 10
df1 <- as.data.frame(matrix(
    runif(n_points_per_group * n_groups),
    ncol = n_groups
))
colnames(df1) <- sample(group_names, n_groups)

现在将数据帧转换为长格式。 (这里使用reshape 包。你也可以使用stats::reshape。)

melted_df1 <- melt(df1)

根据第二个字符和数字匹配的条件定义分组。

melted_df1$group <- with(melted_df1, paste(
    substring(variable, 2, 2),    
    substring(variable, 5, 6),
    sep = ""
))

现在致电tapply(或plyr::ddply,如果您愿意)以获取汇总统计信息。

with(melted_df1, tapply(value, group, mean))

【讨论】:

    猜你喜欢
    • 2013-05-26
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2016-03-24
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多