我在子集函数中获取变量值时遇到问题,从代码中我收到警告“警告:- 中的错误:一元运算符的参数无效”,因为子集函数“-c(val)”中的“val”未定义为变量以上
cname <- c("A1","A2","A3","A4","A5","A6","A7","A8","A9","A10",
"A11","A12","A13","A14","A15","A16","A17","A18","A19","A20",
"A21","A22","A23","A24","A25","A26","A27","A28","A29","A30","A31")
for (i in 15:length(cname)) {
val <- cname[i]
ifelse(sum(!is.na(df2$val))==0,
df2 <- subset(df2, select = -c(val)),
df2)
}
请任何人告诉我如何从 val 中获取值,这样我就可以删除只有 NA 值的列。我仍然是使用 r
的初学者我们可以在没有循环的情况下使用
subset
- 在逻辑矩阵 (colSums
) 上使用矢量化 is.na(df2)
返回每列中 NA 的计数,比较 (!=
) 它与行数 ( nrow(df2)
) 创建一个逻辑向量,子集列名,在 select
参数中使用它 subset
subset(df2, select = names(df2)[colSums(is.na(df2)) != nrow(df2)])
-输出
A1 A2 A4 A5
1 1 1 NA 10
2 2 2 NA 10
3 3 3 NA 10
4 4 NA 3 10
5 5 5 2 10
或使用
tidyverse
- 使用 select
并检查每列中的 any
非 NA 元素以选择列
library(dplyr)
df2 %>%
select(where(~ any(!is.na(.x))))
-输出
A1 A2 A4 A5
1 1 1 NA 10
2 2 2 NA 10
3 3 3 NA 10
4 4 NA 3 10
5 5 5 2 10
df2 <- data.frame(A1 = 1:5, A2 = c(1:3, NA, 5), A3 = NA_integer_,
A4 = c(NA, NA, NA, 3, 2), A5 = 10)