我有以下df:
A B C D E F
1 8 0 0 0 0 0
2 2 1 5 7 1 2
3 1 0 0 2 1 0
4 6 0 0 0 0 2
我想首先将数据分组为2组,每组有3个重复,例如答:C是一组,D:F是第二组。
然后,我希望在任一组中的至少2个重复/列中排除值= 0的任何行。所以我应该回到以下df:
A B C D E F
1 2 1 5 7 1 2
2 1 0 0 2 1 0
非常感谢任何帮助!
答案 0 :(得分:1)
我的解释是:
> dat[ rowSums(dat[1:3]==0)<2 | rowSums(dat[4:6]==0)<2 , ]
A B C D E F
2 2 1 5 7 1 2
3 1 0 0 2 1 0
这是字面音译(逻辑上应该相同):
> dat[ !( rowSums(dat[1:3]==0)>=2 & rowSums(dat[4:6]==0)>=2) , ]
A B C D E F
2 2 1 5 7 1 2
3 1 0 0 2 1 0
答案 1 :(得分:0)
尝试:
ddf = structure(list(A = c(8L, 2L, 1L, 6L), B = c(0L, 1L, 0L, 0L),
C = c(0L, 5L, 0L, 0L), D = c(0L, 7L, 2L, 0L), E = c(0L, 1L,
1L, 0L), F = c(0L, 2L, 0L, 2L)), .Names = c("A", "B", "C",
"D", "E", "F"), class = "data.frame", row.names = c(NA, -4L))
df1 = ddf[,1:3]
df2 = ddf[,4:6]
ddf[which(rowSums(df2==0)<2 & rowSums(df1==0)<2),]
A B C D E F
2 2 1 5 7 1 2
您的标准是:&#34;然后我要在任一组中的至少2个重复/列中排除值= 0的任何行。&#34; 因此,只有一行满足此标准。你自己答案中的第二行(1 0 0 2 1 0) 不符合此标准,因为此处的第一组有2个零(1 0 0)。
答案 2 :(得分:0)
如果您有两个以上的小组,可以这样做:
N <- ncol(dat)
indx <- Reduce(`|`,
lapply(seq(1,N, by=3), function(i) rowSums(!dat[i:(i+2)])<2) )
dat[indx,]
# A B C D E F
#2 2 1 5 7 1 2
#3 1 0 0 2 1 0