Как удалить дублированные значения в неравных столбцах таблицы data.table? - PullRequest
0 голосов
/ 16 января 2020

Я хочу удалить дублированные значения в каждом столбце неравномерной таблицы данных. Например, если исходные данные (таблица реальных данных имеет много столбцов и строк):

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. Однако я получаю только первое дублированное значение в каждом столбце, замененное на «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

Как мне изменить код, чтобы заменить все дубликаты?

Ответы [ 2 ]

0 голосов
/ 17 января 2020

Я полагаю, что это будет правильный data.table способ выполнения этой задачи:

cols <- colnames(dt)
dt[, (cols) := 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

Примечание:

  • .SD по умолчанию все столбцы, поэтому в этом случае нет необходимости указывать аргумент .SDcols.
  • Использование := позволяет избежать копирования всего data.table.
0 голосов
/ 17 января 2020

Вы были очень близки. Вместо использования anyDuplicated я использовал duplicated следующим образом:

dt[, lapply(.SD, function(x) ifelse(duplicated(x) == TRUE, NA, x))]

Попробуйте dt[, lapply(.SD, duplicated)], чтобы получить представление о том, что будет делать ifelse.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...