【问题标题】:How to remove duplicated values in uneven columns of a data.table?如何删除 data.table 的不均匀列中的重复值?
【发布时间】:2020-05-03 09:10:08
【问题描述】:

我想删除不均匀 data.table 的每一列中的重复值。例如,如果原始数据是(真实数据表有很多列和行):

dt <- data.table(A = c("5p", "3p", "3p", "6y", NA), B = c("1c", "4r", "1c", NA, NA), C = c("4f", "5", "5", "5", "4m"))
> dt
      A    B  C
1:   5p   1c 4f
2:   3p   4r  5
3:   3p   1c  5
4:   6y <NA>  5
5: <NA> <NA> 4m

删除每列中的重复值后,它应该如下所示:

A    B    C
5p   1c   4f
3p   4r   5
NA   NA   NA
6y   NA   NA
NA   NA   4m

我正在尝试使用 data.table 在另一个线程中提出的解决方案。但是,我只将每列中的第一个重复值替换为“NA”,而不是后续值。

cols <- colnames(dt)
dt[, lapply(.SD, function(x) replace(x, anyDuplicated(x), NA)), .SDcols = cols]
> dt
      A    B    C
1:   5p   1c   4f
2:   3p   4r    5
3: <NA> <NA> <NA>
4:   6y <NA>    5
5: <NA> <NA>   4m

我应该如何修改代码以替换所有重复项?

【问题讨论】:

  • 嘿@juancho,链接帖子中的解决方案对您不起作用?

标签: r duplicates data.table


【解决方案1】:

你们很亲密。我没有使用anyDuplicated,而是像这样使用duplicated

dt[, lapply(.SD, function(x) ifelse(duplicated(x) == TRUE, NA, x))]

尝试dt[, lapply(.SD, duplicated)] 了解ifelse 的作用。

【讨论】:

    【解决方案2】:

    我相信这将是正确 data.table 完成此任务的方式:

    cols <- colnames(dt)
    dt[, (cols) := lapply(.SD, function(x) replace(x, duplicated(x), NA))]
    
          A    B    C
    1:   5p   1c   4f
    2:   3p   4r    5
    3: <NA> <NA> <NA>
    4:   6y <NA> <NA>
    5: <NA> <NA>   4m
    

    注意:

    • .SD 默认为所有列,因此在这种情况下无需指定 .SDcols 参数。
    • 使用:= 可避免复制整个data.table。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2022-11-13
      • 1970-01-01
      • 2022-06-10
      • 1970-01-01
      • 2020-01-04
      • 2022-01-24
      • 2012-05-21
      • 1970-01-01
      相关资源
      最近更新 更多