R data.table генерирует уникальные значения каждого столбца - PullRequest
0 голосов
/ 01 мая 2018

У меня есть 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

Какой самый эффективный способ достижения этого?

Ответы [ 2 ]

0 голосов
/ 01 мая 2018

одним способом вы можете сделать: (хотя я думаю, что не очень эффективно:)

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
0 голосов
/ 01 мая 2018

Это то, что я понял по вашему вопросу, демо у вас не совсем соответствует тому, что вы объяснили в ответ на мой комментарий.

Это находит дубликаты в каждом столбце и устанавливает любой в 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
...