首页 > 解决方案 > 用 NA 替换 data.table 列中的重复值

问题描述

我想删除不均匀 data.table 的每一列中的重复值。例如,如果原始数据是(真实的 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 在另一个线程中提出的解决方案(使用 dplyr 将时间序列数据中的重复值替换为 NA)。但是,我只将每列中的第一个重复值替换为“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

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

标签: rduplicatesdata.table

解决方案


利用duplicated

library(data.table)
dt[, 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

推荐阅读