R - 如何根据某些变量中的NA值的数量排除个案

时间:2018-03-29 10:31:00

标签: r subset missing-data

我有一个包含22个变量的数据框(由于数据是保密的,我不能在此发布)。我需要删除所有在变量4到22中具有所有NA的情况。因此,如果某个情况在变量4到22中至少有一个非NA,我必须保留它。如果前三个变量中存在或不存在NA值,则无关紧要,但我还需要将这三个变量保留在我的数据帧中。

我正在尝试这段代码:

df<-df[rowSums(is.na(df[,c(4:22)]))==19]

但是我收到了一个错误:

Error in `[.data.frame`(df, rowSums(is.na(df[, c(4:22)])) == 19) : 
undefined columns selected

有没有人对如何做有任何建议?谢谢!

1 个答案:

答案 0 :(得分:2)

你非常接近解决方案。您可以在colSums列上试用4:22。此外,请添加3 TRUE以保留前3列。

df[c(rep(TRUE,3),colSums(is.na(df[4:22])) != nrow(df) )]

如果OP希望在第4:22列中排除rows所有NA值,那么解决方案可能是:

df[rowSums(is.na(df[,c(4:22)])) != 19, ]

将上述解决方案应用于包含8列的数据框:

df[c(rep(TRUE,3),colSums(is.na(df[4:8])) != nrow(df) )]
#    ID Status V1 V2 V3 V4 V5
# 1   1      0  1  0  0  0  1
# 2   1      0  1  0  0  0  1
# 3   1      1  1  1  1  1  1
# 4   2      0  2  0  0  0  2
# 5   2      1  2  1  1  1  2
# 6   2     NA  2 NA NA NA  2
# 7   3      0  3  0  0  0  3
# 8   3      1  3  1  1  1  3
# 9   3     NA  3 NA NA NA  3
# 10  3     NA  3 NA NA NA  3

示例data.frame

   ID Status V1 V2 V3 V4 V5 V6
1   1      0  1  0  0  0  1 NA
2   1      0  1  0  0  0  1 NA
3   1      1  1  1  1  1  1 NA
4   2      0  2  0  0  0  2 NA
5   2      1  2  1  1  1  2 NA
6   2     NA  2 NA NA NA  2 NA
7   3      0  3  0  0  0  3 NA
8   3      1  3  1  1  1  3 NA
9   3     NA  3 NA NA NA  3 NA
10  3     NA  3 NA NA NA  3 NA