【问题标题】:How to retain only first occurrence of duplicates in a row?如何在一行中只保留第一次出现的重复项?
【发布时间】:2019-08-15 06:23:25
【问题描述】:

我正在寻找一种方法来识别 data.table 中的逐行重复值并将其替换为 NA

以下答案可帮助我识别逐行重复...

Removing duplicate values row-wise in R

...但我正在寻找解决这些重复项的方法。

问题

(dt <- data.table(X = 1:10, Y = seq(1, 19, by = 2), Z = c(1, rep(3, 9))))
     X  Y Z
 1:  1  1 1
 2:  2  3 3
 3:  3  5 3
 4:  4  7 3
 5:  5  9 3
 6:  6 11 3
 7:  7 13 3
 8:  8 15 3
 9:  9 17 3
10: 10 19 3

预期结果

     X   Y  Z
 1:  1  NA NA
 2:  2   3 NA
 3:  3   5 NA
 4:  4   7  3
 5:  5   9  3
 6:  6  11  3
 7:  7  13  3
 8:  8  15  3
 9:  9  17  3
10: 10  19  3

请帮忙

【问题讨论】:

  • 重塑为长格式。然后这变得容易(且高效)。

标签: r data.table


【解决方案1】:

这是data.table 解决方案:

dt[, row := .I
   ][, melt(.SD, id.cols = "row", measure.vars = c("X", "Y", "Z"))
     ][, value := replace(value, duplicated(value), NA), by = row
       ][, dcast(.SD, row ~ variable)
         ][, !"row"]

【讨论】:

  • @Ronald 的 cmets 让我考虑了这个答案。 @sindri_baldur:你能不能修改这个在最终输出中不包含row 列?
  • 感谢@sindhi_baldur 最后一件事。我可以做些什么来保留 ID 列?例如,如下所示的 data.table:(dt &lt;- data.table(ID = LETTERS[1:10], X = 1:10, Y = seq(1, 19, by = 2), Z = c(1, rep(3, 9))))
  • @SanjidRahman dt[, row := .I ][, melt(.SD, id.cols = c("ID", "row"), measure.vars = c("X", "Y", "Z")) ][, value := replace(value, duplicated(value), NA), by = row ][, dcast(.SD, ID + row ~ variable) ][, !"row"]
【解决方案2】:

基本上是@akrun 的答案的更短版本:

dt[t(apply(dt, 1, duplicated))] <- NA

【讨论】:

  • 这是非常低效的。
  • @Roland 如果您有任何解决方案,请详细说明或提供更有效的解决方案。请记住,OP 要求提供有效的解决方案,并且没有指定数据集的大小。他们也没有要求针对非常大的数据集的解决方案。
  • apply 深度复制整个数据集。 sindri_baldur 的答案中已经显示了正确的 data.table 方式。
【解决方案3】:

base R 的选项

setDF(dt)
dt[] <- t(apply(dt, 1, function(x) replace(x, duplicated(x), NA)))

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2019-09-05
    • 1970-01-01
    • 2016-09-10
    • 1970-01-01
    • 2016-10-11
    • 1970-01-01
    • 1970-01-01
    • 2023-03-04
    相关资源
    最近更新 更多