Avi*_*Avi 6 row r col dataframe na
我有以下dataframe(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)
Run Code Online (Sandbox Code Playgroud)
可以看出,在这种情况下,第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
Run Code Online (Sandbox Code Playgroud)
有没有办法得到省略的行和列号(在这种情况下为5)?
我们可以尝试
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
Run Code Online (Sandbox Code Playgroud)
假设我们更改 's' 中的某个值
s$V7[3] <- NA
Run Code Online (Sandbox Code Playgroud)
通过运行上面的代码,输出将是
# 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
Run Code Online (Sandbox Code Playgroud)
注意:OP 的条件仅包括 NA 和 0 值。我想省略它们