使用粘贴和!is.na子集数据帧

时间:2018-07-02 17:57:56

标签: r loops subset paste

我正在尝试使用“ for循环”为标准lm模型定义数据帧的子集。在子集表达式中,我想使用粘贴引用col1并对所有观察项进行子集化,其中col1-3不是NA。我已经尝试了以下方法,但是它们不起作用:

    for(i in 1:3) {
lm(y ~ x1 + x2, data=subset(df, x3="Y" & !is.na(paste0("col", i))))
}

或单独定义名称:

    for(i in 1:3) {
colname <- as.name(paste0("col", i))
lm(y ~ x1 + x2, data=subset(df, x3="Y" & !is.na(colname)))
}

顺便说一句:这是一个简化的代码,用以说明我正在尝试做的事情。我的脚本中的代码没有给出错误,但是忽略了子集表达式的!is.na条件。但是,如果这样手动完成,它将起作用:

    lm(y ~ x1 + x2, data=subset(df, x3="Y" & !is.na(col1)))

我将不胜感激一些建议!

谢谢!

FK

1 个答案:

答案 0 :(得分:1)

is.na()部分被“忽略”,因为您认为被评估的不是被评估的。正在评估的是:

!is.na("col1")

,字符串“ col1”显然不是NA,因此它的计算结果为TRUE,并为数据中的所有行回收。您遇到的问题是您将变量名存储为字符串,并且subset()需要逻辑向量。因此,您需要一种方法来使用存储在字符串中的变量名,并使用它来获取subset()所需的相应评估逻辑向量。您可以通过以下方式更新代码以使用某些东西:

for(i in 1:3) {
  lm(y ~ x1 + x2, data=subset(df, x3=="Y" & !is.na(df[[paste0("col", i)]])))
}

虽然这不是最佳选择,但是还有其他方法可以并且可能应该更新代码。类似于:

for(i in 1:3) {
  lm(y ~ x1 + x2, data = df,
    subset = df$x3 == "Y" & !is.na(df[[paste0("col", i)]]))
}

有点干净,因为它使用subset参数来对数据进行子集化。

您仍然有一个问题,就是没有将调用lm()的结果存储在任何地方。