【问题标题】:R data.table generate unique values of each columnR data.table 生成每列的唯一值
【发布时间】:2018-04-30 23:54:23
【问题描述】:

我有一个 data.table,我需要生成另一个 data.table,它只列出每列的唯一值。一个例子:

来自

> sourceDT <- data.table(ID = c(1,2,3,4), date = c(ymd("20110101"),ymd("20110101"),ymd("20130101"),ymd("20150101")), text = c("A","B","C","C"))
> sourceDT
   ID       date text
1:  1 2011-01-01    A
2:  2 2011-01-01    B
3:  3 2013-01-01    C
4:  4 2015-01-01    C

> outputDT <- data.table(ID = c(1,2,3,4),date = c(ymd("20110101"),ymd("20130101"),ymd("20150101"),NA), text = c("A","B","C",NA))
> outputDT
   ID       date text
1:  1 2011-01-01    A
2:  2 2013-01-01    B
3:  3 2015-01-01    C
4:  4       <NA>   NA

实现这一目标的最有效方法是什么?

【问题讨论】:

  • 200+ 列和 100k+ 行。
  • 所以不是唯一值组合?您希望保留每列的第一次出现并保留 data.table 的大小吗?
  • @LeGeniusII 能解释一下输出的第二行和第三行吗?你是怎么知道的?
  • @zacdav 不,不是唯一的值组合,是的,每列第一次出现并保持 data.table 的大小。
  • @YOLO 我不需要唯一的值组合,只需要每列中的唯一值。

标签: r data.table unique


【解决方案1】:

你可以做的一种方式:(虽然我猜不是很有效:)

sourceDT[,lapply(.SD, function(x)sort(`is.na<-`(x,duplicated(x)),na.last = T))]
   ID       date text
1:  1 2011-01-01    A
2:  2 2013-01-01    B
3:  3 2015-01-01    C
4:  4       <NA>   NA

【讨论】:

  • is.na&lt;- 在这里做什么?看不懂。
  • 如果一个值重复,则设为NA
【解决方案2】:

这就是我对您的问题的理解,您的演示与您在回复我的评论时所解释的不太相符。

这会在每列中查找重复项并将 any 设置为 NA,这会保留 data.table 的大小。

library(data.table)
library(lubridate)
sourceDT <- data.table(ID = c(1,2,3,4), date = c(ymd("20110101"),ymd("20110101"),ymd("20130101"),ymd("20150101")), text = c("A","B","C","C"))


for (i in seq_along(sourceDT)) {
  dupes <- which(duplicated(sourceDT[[i]]))
  if (length(dupes > 0)) {
    set(sourceDT, dupes, i, NA)
  }
}

#    ID       date text
# 1:  1 2011-01-01    A
# 2:  2       <NA>    B
# 3:  3 2013-01-01    C
# 4:  4 2015-01-01   NA

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2021-12-24
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多