我有以下数据框(s
):
s<-read.table(text = "V1 V2 V3 V4 V5 V6 V7 V8 V9 V10
1 0 62 64 44 NA 55 81 66 57 53
2 0 0 65 50 NA 56 79 69 52 55
3 0 0 0 57 NA 62 84 76 65 59
4 0 0 0 0 NA 30 70 61 41 36
5 0 0 0 0 NA NA NA NA NA NA
6 0 0 0 0 0 0 66 63 51 44
7 0 0 0 0 0 0 0 80 72 72
8 0 0 0 0 0 0 0 0 68 64
9 0 0 0 0 0 0 0 0 0 47
10 0 0 0 0 0 0 0 0 0 0 ", header = TRUE)
可以看出,在这种情况下,第5行和第5列仅包含NA
和0
值。我想省略它们并保持行和列的顺序。在同一模式中可能有更多的列和行,我想做同样的事情。可能会更改数据框的大小。
最终结果将是:
V1 V2 V3 V4 V6 V7 V8 V9 V10
1 0 62 64 44 55 81 66 57 53
2 0 0 65 50 56 79 69 52 55
3 0 0 0 57 62 84 76 65 59
4 0 0 0 0 30 70 61 41 36
6 0 0 0 0 0 66 63 51 44
7 0 0 0 0 0 0 80 72 72
8 0 0 0 0 0 0 0 68 64
9 0 0 0 0 0 0 0 0 47
10 0 0 0 0 0 0 0 0 0
有没有办法获得省略的行号和列号(在本例中为5)?
答案 0 :(得分:4)
您必须详细说明何时要删除。在这种情况下,它看起来像一边的矩阵,对角线总是为0.
但是,一般来说,这就是我使用的
s[!rowSums(is.na(s))>1,!colSums(is.na(s))>1]
考虑0
s[!rowSums(is.na(s)|s==0)>9,!colSums(is.na(s)|s==0)>9]
答案 1 :(得分:3)
我们可以尝试
v1 <- colSums(is.na(s))
v2 <- colSums(s==0, na.rm=TRUE)
j1 <- !(v1>0 & (v1+v2)==nrow(s) & v2 >0)
v3 <- rowSums(is.na(s))
v4 <- rowSums(s==0, na.rm=TRUE)
i1 <- !(v3>0 & (v3+v4)==ncol(s) & v3 >0)
s[i1, j1]
# V1 V2 V3 V4 V6 V7 V8 V9 V10
#1 0 62 64 44 55 81 66 57 53
#2 0 0 65 50 56 79 69 52 55
#3 0 0 0 57 62 84 76 65 59
#4 0 0 0 0 30 70 61 41 36
#6 0 0 0 0 0 66 63 51 44
#7 0 0 0 0 0 0 80 72 72
#8 0 0 0 0 0 0 0 68 64
#9 0 0 0 0 0 0 0 0 47
#10 0 0 0 0 0 0 0 0 0
假设我们改变's'中的一个值
s$V7[3] <- NA
通过运行上面的代码,输出将是
# V1 V2 V3 V4 V6 V7 V8 V9 V10
#1 0 62 64 44 55 81 66 57 53
#2 0 0 65 50 56 79 69 52 55
#3 0 0 0 57 62 NA 76 65 59
#4 0 0 0 0 30 70 61 41 36
#6 0 0 0 0 0 66 63 51 44
#7 0 0 0 0 0 0 80 72 72
#8 0 0 0 0 0 0 0 68 64
#9 0 0 0 0 0 0 0 0 47
#10 0 0 0 0 0 0 0 0 0
注意:OP的条件是仅包括NA和0值。我想省略它们
答案 2 :(得分:3)
我打算建议:
sclean <- s[rowSums(s == 0|is.na(s)) != ncol(s) | (rowSums(s == 0, na.rm=TRUE) == ncol(s)),
colSums(s == 0|is.na(s) )!= nrow(s) | colSums(s == 0, na.rm=TRUE) == nrow(s)]
答案 3 :(得分:1)
您可以尝试以下方法:
myRowSums <- rowSums(is.na(s) | s == 0)
myColSums <- colSums(is.na(s) | s == 0)
sSmall <- s[which(myRowSums != ncol(s)), which(myColSums != nrow(s))]
它适用于以下数据集,以删除完全由0和NA组成的所有列和行。
s <- data.frame(a=c(0, rnorm(5), 0), b=c(0, rnorm(2), NA, NA,1, NA), c=c(rep(c(0,NA), 3), 0))