Вставить несколько столбцов data.table в один столбец на основе уникальных значений - PullRequest
1 голос
/ 24 февраля 2020

У меня есть data.table, который выглядит следующим образом:

require("data.table")

dt1 <- data.table(VAR1 = c("Brick","Sand","Concrete","Stone"), VAR2 = c(100,23,76,43), VAR3 = c("Place","Location","Place","Vista"), VAR4 = c("Place","Tree","Wood","Vista"), VAR5 = c("Place","Tree","Wood","Forest"))

Я хотел бы вставить именованные столбцы (в моих реальных данных есть дополнительные столбцы) вместе в следующем порядке: VAR2, VAR1, VAR3, VAR4 и VAR5. Однако у меня есть два условия:

  • Значения в одной строке не должны дублироваться (при дублировании значений должен сохраняться столбец с последней записью - поэтому в моем примере «Место» в Будет сохранен VAR5)
  • При вставке запятая должна быть разделителем, за исключением между VAR2 и VAR1

Мой ожидаемый результат будет выглядеть следующим образом:

dt2 <- data.table(VAR6 = c("100 Brick, Place","23 Sand, Location, Tree","76 Concrete, Place, Wood","43 Stone, Vista, Forest"))

1 Ответ

1 голос
/ 24 февраля 2020

Мы можем использовать do.call(paste после выбора столбца в порядке в .SDcols, удалить дублирующиеся слова с выражением регулярного выражения

dt1[,  .(VAR6 = sub(",", " ", gsub("\\b(\\w+)\\b\\s*,\\s*(?=.*\\1)", "", 
      do.call(paste, c(.SD, sep=",")), perl = TRUE))), 
           .SDcols = names(dt1)[c(2:1, 3:5)]]
#                     VAR6
#1:        100 Brick,Place
#2:  23 Sand,Location,Tree
#3: 76 Concrete,Place,Wood
#4:  43 Stone,Vista,Forest

или сгруппировать по последовательности строк и сделать paste

V6 <- dt1[, sprintf("%s %s, %s", VAR2, VAR1, 
   toString(unique(unlist(.SD)))), 1:nrow(dt1), .SDcols = VAR3:VAR5]$V1
data.table(V6)
#                     V6
#1:         100 Brick, Place
#2:  23 Sand, Location, Tree
#3: 76 Concrete, Place, Wood
#4:  43 Stone, Vista, Forest
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...