【问题标题】:get rows of unique values by group按组获取唯一值的行
【发布时间】:2013-08-28 07:38:15
【问题描述】:

我有一个 data.table 并且想要选择 data.table 中变量 x 的某些值相对于另一个变量 y 是唯一的那些行

可以在单独的数据集中获取 x 的唯一值,按 y 分组,如下所示

dt[,unique(x),by=y]

但我想在原始数据集中选择出现这种情况的行。我不想要新的 data.table,因为我还需要其他变量。

那么,我必须在我的代码中添加什么来获取dt 中符合上述条件的行?

dt <- data.table(y=rep(letters[1:2],each=3),x=c(1,2,2,3,2,1),z=1:6) 

   y x z
1: a 1 1
2: a 2 2
3: a 2 3
4: b 3 4
5: b 2 5
6: b 1 6

我想要什么:

   y x z
1: a 1 1
2: a 2 2
3: b 3 4
4: b 2 5
5: b 1 6

【问题讨论】:

    标签: r data.table


    【解决方案1】:

    惯用的data.table方式是:

    require(data.table)
    unique(dt, by = c("y", "x"))
    #    y x z
    # 1: a 1 1
    # 2: a 2 2
    # 3: b 3 4
    # 4: b 2 5
    # 5: b 1 6
    

    【讨论】:

      【解决方案2】:

      data.tableduplicated 的使用方式上略有不同。这是我以前在这里看到过的方法:

      dt <- data.table(y=rep(letters[1:2],each=3),x=c(1,2,2,3,2,1),z=1:6) 
      setkey(dt, "y", "x")
      key(dt)
      # [1] "y" "x"
      !duplicated(dt)
      # [1]  TRUE  TRUE FALSE  TRUE  TRUE  TRUE
      dt[!duplicated(dt)]
      #    y x z
      # 1: a 1 1
      # 2: a 2 2
      # 3: b 1 6
      # 4: b 2 5
      # 5: b 3 4
      

      【讨论】:

      • +1 顺便说一句,Steve 已将 by 添加到 duplicatedunique 用于 data.table,因此在下一个版本中您可以指定要测试的列:unique(dt,by=c("y","x"))。在 R-Forge 上的 v1.8.9 中。默认情况下,bykey(dt),因此如果未提供 by,它会像以前一样工作。
      • 但是identical(unique(dt),dt[!duplicated(dt)])在你设置好密钥后是真的,那为什么不使用unique呢?
      【解决方案3】:

      更简单的data.table解决方案是抓取每组的第一个元素

      > dt[, head(.SD, 1), by=.(y, x)]
         y x z
      1: a 1 1
      2: a 2 2
      3: b 3 4
      4: b 2 5
      5: b 1 6
      

      【讨论】:

        【解决方案4】:

        感谢 dplyR

        library(dplyr)
        col1 = c(1,1,3,3,5,6,7,8,9)
        col2 = c("cust1", 'cust1', 'cust3', 'cust4', 'cust5', 'cust5', 'cust5',     'cust5', 'cust6')
        df1 = data.frame(col1, col2)
        df1
        
        distinct(select(df1, col1, col2))
        

        【讨论】:

          猜你喜欢
          • 1970-01-01
          • 1970-01-01
          • 2020-02-10
          • 1970-01-01
          • 2017-01-27
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          相关资源
          最近更新 更多