我正在尝试使用“ 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
答案 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()
的结果存储在任何地方。