【问题标题】:R - cannot use variable generated by for loop as argument in table()R - 不能使用 for 循环生成的变量作为 table() 中的参数
【发布时间】:2016-09-21 09:41:53
【问题描述】:

我正在尝试在全局环境 (df) 中存在的数据框中的一组列上提取 prop.test p 值,并将它们保存为数据框。我有一个标准列和 19 个变量列(等等)

proportiontest <- function() {
  prop_df <- data.frame()
  for(i in 1:19) {
    x <- paste("df$var_", i, sep="")
    y <- (prop.test(table(df$criteria, x), correct=FALSE))$p.value
    z <- cbind (x, y)
    prop_df <- rbind(prop_df, z)
  }
  assign("prop_df",prop_df,envir = .GlobalEnv)
}
proportiontest()

当我运行它时,我得到了错误:

Error in table(df$criteria, x) : all arguments must have the same length 

当我手动将列名插入函数(而不是 x)时,一切运行正常。例如

y <- (prop.test(table(df$criteria, df$var_1), correct=FALSE))$p.value

我似乎有使用通过for循环生成的变量(x)值作为参数的问题。

在这种情况下,我错过了什么或做错了什么?我尝试将 x 传递给 table() 函数 as.String(x) as.character(x) 以及无数其他函数,但无济于事。我似乎无法理解论证必须采用哪种形式。我可能误解了 R 中一些非常基本的东西,但这让我发疯了,我似乎无法以 google/SO 可以帮助我的方式提出问题。

【问题讨论】:

  • 检查 x 的值。正如它所定义的那样,它是一个字符串。 (除此之外,你可能应该重新考虑你做整件事的方式......)
  • 你在这里做的一切都错了。使用assign,循环增长对象,用多个数据集破坏你的全局环境等等。你应该重新考虑为什么你认为你需要这个以及你想如何处理这个。
  • 例如,假设criteriadf 的第一列(为简单起见),试试data.frame(P_vals = sapply(df[-1], function(x) prop.test(table(df$criteria, x), correct=FALSE)$p.value))
  • 非常感谢!我必须说我是 R 的初学者(以及一般的编程),只是试图从逻辑上处理事情而不是“R 方式”。无论如何,您的示例运行良好,我肯定会在将来尝试以不同的方式处理这些事情。如果你看到我的脚本文件,你会杀了一只小猫,但至少我能得到我的答案!再次感谢'

标签: r


【解决方案1】:

目前在你的函数中 x 只是一个字符串。如果您想使用数据框 df 中的列,可以在 for 循环中执行此操作:

x <- df[,i]

然后您需要更改 z 或者您将 cbinding 列绑定到单个 p 值,也许只需更改为:

z <- cbind(i,y)

以便您知道哪个 df 列属于每个 p 值。

您也应该小心,因为该函数将搜索在其内部创建的 df,如果找不到,则移动到父环境,因此也许您可以将 df 作为参数传递以避免任何错误。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2017-08-16
    • 1970-01-01
    • 1970-01-01
    • 2017-11-28
    • 1970-01-01
    • 2019-09-27
    相关资源
    最近更新 更多