【问题标题】:unique rows in data frame based on if's基于 if 的数据框中的唯一行
【发布时间】:2017-08-11 09:46:19
【问题描述】:

我有一个大型数据表(数百万行),我需要将其中的行缩减为每个 ID 一行。规则是,如果“X”以外的其他艺术作品在唯一 ID 中, X'es 应该被删除。但如果唯一 ID 中没有其他艺术作品,则 X 应该保留。

测试数据集:

dt <- data.table(
  ID=c(1,1,1,2,2,3,4,4),
  art=c("X", "Y", "X", "X", "X", "X", "Z", "X"),
  redskb=c("a", "Y", "a", "b", "b", "c", "k", "n")
)

   ID art redskb
1:  1   X      a
2:  1   Y      Y
3:  1   X      a
4:  2   X      b
5:  2   X      b
6:  3   X      c
7:  4   X      k
8:  4   Z      n

需要的输出:

    ID art redskb
1:  1   Y      Y   
2:  2   X      b
3:  3   X      c
4:  4   Z      n

我试过了

unique(dt, by = c("ID"))

但无法让它与 if 一起有效地工作。

【问题讨论】:

  • 也许像unique(dt)[, flag := if (.N == 1) TRUE else art != "X", ID][(flag)]
  • 你的例子有问题,你打印的不是你定义的

标签: r if-statement data.table


【解决方案1】:

我会尝试这样的:

unique(dt)[, `:=`(flag, if (.N == 1) TRUE else art != "X"), ID][(flag)]
##    ID art redskb flag
## 1:  1   Y      Y TRUE
## 2:  2   X      b TRUE
## 3:  3   X      c TRUE
## 4:  4   Z      k TRUE

【讨论】:

    【解决方案2】:

    data.table:

    dt[order(ID,art=="X"),.SD[1],ID]
    

    或@Frank 的版本:

    unique(dt[order(ID,art == "X")], by="ID")
    
    #    ID art redskb
    # 1:  1   Y      Y
    # 2:  2   X      b
    # 3:  3   X      c
    # 4:  4   Z      k
    

    dplyr:

    dt %>% group_by(ID) %>% slice(which.max(art != "X"))
    #   # A tibble: 4 x 3
    #   # Groups:   ID [4]
    #        ID    art redskb
    #     <dbl> <fctr>  <chr>
    #   1     1      Y      Y
    #   2     2      X      b
    #   3     3      X      c
    #   4     4      Z      k
    

    【讨论】:

      【解决方案3】:

      我们可以的

      dt[dt[, .I[if(uniqueN(art) >1 & any(art == "X")) art!="X" else  seq_len(.N)==1], ID]$V1]
      #   ID art redskb
      #1:  1   Y      Y
      #2:  2   X      b
      #3:  3   X      c
      #4:  4   Z      k
      

      【讨论】:

        猜你喜欢
        • 2017-10-29
        • 1970-01-01
        • 1970-01-01
        • 2020-10-01
        • 2020-03-07
        • 1970-01-01
        • 1970-01-01
        • 2023-04-09
        • 1970-01-01
        相关资源
        最近更新 更多