我有以下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我想首先将数据分成两组,每组有3个重复,例如A: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任何帮助都将不胜感激!
发布于 2014-08-29 14:24:05
我的解释是:
> 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发布于 2014-08-29 14:24:57
尝试:
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您的条件是:“然后,我希望排除任意组中至少2个复制/列中的任何值为0的行。”因此,只有一行满足此条件。您自己的答案中的第二行(1 0 0 2 1 0)不满足此条件,因为这里的第一组有2个零(1 0 0)。
发布于 2014-08-29 16:57:01
如果您有两个以上的组,您可以执行以下操作:
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 0https://stackoverflow.com/questions/25562547
复制相似问题