【问题标题】:using R - delete rows when a value repeated less than 3 times使用 R - 当值重复少于 3 次时删除行
【发布时间】:2017-02-11 19:30:50
【问题描述】:

10行3列的框架

    a   b c
1   1 201 1
2   2 202 1
3   3 203 1
4   4 204 1
5   5 205 4
6   6 206 5
7   7 207 4
8   8 208 4
9   9 209 8
10 10 210 5

我想删除列“c”中相同值重复少于 3 次的所有行。 在此示例中,我想删除第 6、9 和 10 行。(我的真实 data.frame 有 5000 行和 25 列) 我尝试使用函数 rle 来做,但我一直得到错误的解决方案。 有什么帮助吗?谢谢!

【问题讨论】:

    标签: r row dataframe


    【解决方案1】:

    Joshua's answer 为基础:

    Data[Data$c %in% names(which(table(Data$c) > 2)), ]
    

    【讨论】:

      【解决方案2】:

      如果我错了,请纠正我,但您似乎想要 c 列中的值出现两次以上的所有行。 “重复”让我认为它们需要连续发生,这就是 rle 的用途,但如果这是你想要做的,你只会想要第 1-4 行。

      也就是说,下面的代码查找 c 列中的值出现超过 2 次的行。我确信这可以更优雅地完成,但它确实有效。

      lines <-
      "a   b c
      1 201 1
      2 202 1
      3 203 1
      4 204 1
      5 205 4
      6 206 5
      7 207 4
      8 208 4
      9 209 8
      10 210 5"
      Data <- read.table(con <- textConnection(lines), header=TRUE); close(con)
      cVals <- data.frame(table(Data$c))
      Rows <- Data$c %in% cVals[cVals$Freq > 2,1]
      Data[Rows,]
      #  a   b c
      #1 1 201 1
      #2 2 202 1
      #3 3 203 1
      #4 4 204 1
      #5 5 205 4
      #7 7 207 4
      #8 8 208 4
      

      【讨论】:

        【解决方案3】:

        使用 unsplit 可能是将分组聚合(在本例中使用表获取计数,但一般情况请参见 tapply)投影到原始数据的最简单方法。

        subset(Data, with(Data, unsplit(table(c), c)) >= 3)
        

        与 Erik 的等效且更相似:

        Data[unsplit(table(Data$c), Data$c) >= 3, ]
        

        【讨论】:

          【解决方案4】:

          这是使用ave 的解决方案:

          Data[ave(Data$c, Data$c, FUN = length) > 2, ]
          

          或将avesubset 一起使用:

          subset(Data, ave(c, c, FUN = length) > 2)
          

          【讨论】:

            猜你喜欢
            • 2023-04-05
            • 1970-01-01
            • 1970-01-01
            • 1970-01-01
            • 1970-01-01
            • 2021-11-26
            • 2017-02-20
            • 2016-05-18
            • 2017-03-13
            相关资源
            最近更新 更多