【问题标题】:Replace duplicated values with NA in a data.table column用 NA 替换 data.table 列中的重复值
【发布时间】:2020-01-17 10:47:46
【问题描述】:

我想删除不均匀 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 在另一个线程 (replace duplicate values with NA in time series data using dplyr) 中提出的解决方案。但是,我只将每列中的第一个重复值替换为“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

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

【问题讨论】:

  • 是的,对不起@chinsoon12 我是新来的,我认为其他问题已被删除。

标签: r duplicates data.table


【解决方案1】:

使用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

【讨论】:

    【解决方案2】:

    如果我理解正确,OP 希望从每一列中删除所有重复的条目,以便从上到下填充有效负载数据,并将 NA 排列在底部。 (这与OP's other question 不同)。

    OP 自己的尝试以及Ronak's answer 留下NAs 穿插列值。

    如果可以接受删除所有 NA 的行(如 na.omit()),我建议将其整形为长格式,删除重复条目,然后重新整形为宽格式:

    library(data.table)
    dcast(unique(melt(dt, measure.vars = names(dt), na.rm = TRUE)), rowid(variable) ~ variable)[
      , variable := NULL][]
    
        A    B  C
    1: 5p   1c 4f
    2: 3p   4r  5
    3: 6y <NA> 4m
    

    如果要求结果的行数和之前一样,需要修改Ronak's answer

    library(data.table)
    dt[, (names(dt)) := lapply(.SD, function(x) sort(replace(x, duplicated(x), NA), na.last = TRUE))][]
    
    dt
    
          A    B    C
    1:   3p   1c   4f
    2:   5p   4r   4m
    3:   6y <NA>    5
    4: <NA> <NA> <NA>
    5: <NA> <NA> <NA>
    

    注意这里dt是修改到位的。

    注意事项

    通常,如果数据以表格格式(例如 data.frame、date.table 或 tibble)存储,each variable is a column, each observation is a row。在这里,条目被独立于其他列从列中删除,从而导致“不均匀”的 data.table 具有“参差不齐的底部”。

    恕我直言,这是一个强有力的指标,表明表格格式可能不是最佳选择。也许,具有不同数量元素的向量列表会更合适。但是,如果不了解根本问题,这纯粹是猜测。

    dl <- as.list(dt)
    lapply(dl, unique)
    
    $A
    [1] "5p" "3p" "6y" NA  
    
    $B
    [1] "1c" "4r" NA  
    
    $C
    [1] "4f" "5"  "4m"
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2017-10-31
      • 2019-06-27
      • 2015-07-16
      • 2016-03-11
      • 2021-06-28
      • 1970-01-01
      • 2021-10-22
      • 2019-10-11
      相关资源
      最近更新 更多