【问题标题】:Grouping and then filtering data分组然后过滤数据
【发布时间】:2014-10-23 03:03:18
【问题描述】:

我有以下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 个重复,例如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

任何帮助将不胜感激!

【问题讨论】:

  • 你的结果 df 对我来说没有意义。它在第二行有两个零,列 A:C
  • 人们对“each”、“either”、“both”的使用常常与我对它们的逻辑含义的理解不同。

标签: r filter grouping


【解决方案1】:

如果您有 2 个以上的组,您可以这样做:

 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

【讨论】:

    【解决方案2】:

    试试:

    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)。

    【讨论】:

      【解决方案3】:

      我的解释是:

      > 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
      

      【讨论】:

        猜你喜欢
        • 2018-11-15
        • 1970-01-01
        • 2015-11-14
        • 2019-07-18
        • 2017-09-04
        • 1970-01-01
        • 2021-01-05
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多