获取子集函数中的变量值 - R

问题描述 投票:0回答:1

我在子集函数中获取变量值时遇到问题,从代码中我收到警告“警告:- 中的错误:一元运算符的参数无效”,因为子集函数“-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)
}

df2 结果 enter image description here

我的预期结果是删除仅具有 NA 值的不必要的列 enter image description here

请任何人告诉我如何从 val 中获取值,这样我就可以删除只有 NA 值的列。我仍然是使用 r

的初学者
r for-loop subset
1个回答
0
投票

我们可以在没有循环的情况下使用

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)
© www.soinside.com 2019 - 2024. All rights reserved.