使用粘贴和 !is.na 对数据框进行子集化
Use paste and !is.na to subset data frame
我正在尝试使用 "for loop" 为标准 lm 模型定义数据帧的子集。在子集表达式中,我想使用粘贴和子集所有观察值来引用 col1,其中 col1-3 不是 NA。我尝试了以下方法,但它们不起作用:
for(i in 1:3) {
lm(y ~ x1 + x2, data=subset(df, x3="Y" & !is.na(paste0("col", i))))
}
或单独定义 colname:
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
is.na()
部分正在 "ignored" 因为您认为正在评估的内容并不是正在评估的内容。正在评估的是:
!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)]]))
}
更简洁一些,因为它使用子集参数对数据进行子集化。
您仍然遇到问题,即您没有将调用 lm()
的结果存储在任何地方。
我正在尝试使用 "for loop" 为标准 lm 模型定义数据帧的子集。在子集表达式中,我想使用粘贴和子集所有观察值来引用 col1,其中 col1-3 不是 NA。我尝试了以下方法,但它们不起作用:
for(i in 1:3) {
lm(y ~ x1 + x2, data=subset(df, x3="Y" & !is.na(paste0("col", i))))
}
或单独定义 colname:
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
is.na()
部分正在 "ignored" 因为您认为正在评估的内容并不是正在评估的内容。正在评估的是:
!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)]]))
}
更简洁一些,因为它使用子集参数对数据进行子集化。
您仍然遇到问题,即您没有将调用 lm()
的结果存储在任何地方。