分组然后过滤数据

时间:2014-08-29 06:07:51

标签: r filter grouping

我有以下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

非常感谢任何帮助!

3 个答案:

答案 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