我正在处理包含多个单个值或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
。
有什么建议吗?
答案 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)