R - 查找所有值均为NA或单值(0方差)的列

时间:2017-09-26 14:18:28

标签: r

我正在处理包含多个单个值或NA的列的数据框。我知道如何找到一个或另一个列:

df1 <- data.frame(col1 = 1:10, col2 = 0, col3 = seq(1,20,2))
df1[c(1,4,7),'col2'] <- NA


names(df1)[sapply(df1, function(x) sum(is.na(x)) == length(x))]
names(df1)[sapply(df1, function(x) length(unique(x)) == length(x))]

但是,我无法想办法捕获所有NA或单个值。在上述情况下,应该抓住col2

有什么建议吗?

5 个答案:

答案 0 :(得分:3)

首先,您可以检查列中是否存在NA:

any(is.na(df1$col2))

然后,如果您想知道列是否将所有值设置为零而不考虑NA值,请使用:

all(df1$col2 == 0, na.rm = TRUE)

使用 rowSums 作为alex2006建议可能会导致您排除数字总和为0的不便,并且还会标记该列。

答案 1 :(得分:2)

如果您正在查找列,则方差为0,您可以尝试

colvar0<-apply(df1,2,function(x) var(x,na.rm=T)==0)

colvar0

 col1  col2  col3 
FALSE  TRUE FALSE 

获取列名

names(df1)[colvar0]

编辑:假设您有一些只有NA的列,那么colvar0等于NA,您可以使用

检索所有列名称
names(df1)[colvar0|is.na(colvar0)]

答案 2 :(得分:1)

以下可能会这样做。

sapply(df1, function(x){
    na <- is.na(x)
    any(na) && length(unique(x[!na])) == 1
})
# col1  col2  col3 
#FALSE  TRUE FALSE


inx <- sapply(df1, function(x){
    na <- is.na(x)
    any(na) && length(unique(x[!na])) == 1
})

df1[which(inx)]
#   col2
#1    NA
#2     0
#3     0
#4    NA
#5     0
#6     0
#7    NA
#8     0
#9     0
#10    0

df1[which(!inx)]
#   col1 col3
#1     1    1
#2     2    3
#3     3    5
#4     4    7
#5     5    9
#6     6   11
#7     7   13
#8     8   15
#9     9   17
#10   10   19

注意:如果您只想要列名,names[inx]会获得方差为零的那些。

答案 3 :(得分:1)

sapply(df1, function(x) length(unique(sort(x))) %in% 0:1)  #sort removes NA
# col1  col2  col3 
#FALSE  TRUE FALSE 

OR

sapply(df1, function(x) length(unique(x[!is.na(x)])) %in% 0:1)
# col1  col2  col3 
#FALSE  TRUE FALSE 

答案 4 :(得分:0)

如果你想检索发生这种情况的实际行,我建议如下:

which(is.na(rowSums(df1)) | rowSums(df1)==0)