Исключить дублированные значения из разных строк с одинаковым идентификатором - PullRequest
0 голосов
/ 01 мая 2018

У меня есть набор данных, в котором разные значения находятся в одном столбце. Я знаю, что это не очень хорошая практика, но это вне моего контроля. Пример набора данных выглядит следующим образом:

library(data.table)
a1 <- data.table(v1 = "a", v2 = "12,13,12,12,10")
a2 <- data.table(v1 = "b", v2 = "10,10,11,12")
a3 <- data.table(v1 = "b", v2 = "10,10,13,14,12")
DT <- rbindlist(list(a1, a2, a3))

Я хотел бы создать новый столбец, содержащий только уникальные значения в "b" из обеих строк. Я пробовал это:

DT[, v5 := paste(unlist(lapply(v2, function(x) unique(unlist(strsplit(as.character(x), ",", fixed = TRUE))))), collapse = ","), by = v1]

Но это исключает только дублированные значения в каждой строке. Что я получил, это:

   v1             v2                   v5
1:  a 12,13,12,12,10             12,13,10
2:  b    10,10,11,12 10,11,12,10,13,14,12
3:  b 10,10,13,14,12 10,11,12,10,13,14,12

Значения, которые я надеюсь получить в столбце "v5" для строк "b", равны 10,11,12,13,14.

Я очень благодарен за руководство по решению проблемы.

Ответы [ 2 ]

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

Вы очень близки к решению. Вы должны суммировать (paste с collapse) для группы, прежде чем применять unique.

Вы можете попытаться суммировать по v1 как:

DT[, .(v5 = paste(unique(unlist(strsplit(paste(v2,collapse = ","),
                              split = ","))),collapse=",")), by = v1]
#    v1             v5
# 1:  a       12,13,10
# 2:  b 10,11,12,13,14
0 голосов
/ 01 мая 2018
DT[DT[,toString(unique(scan(text = v2,sep = ","))),by=v1],on="v1"]
Read 5 items
Read 9 items
   v1             v2                 V1
1:  a 12,13,12,12,10         12, 13, 10
2:  b    10,10,11,12 10, 11, 12, 13, 14
3:  b 10,10,13,14,12 10, 11, 12, 13, 14

Вы можете включить quiet=T, чтобы не печатать количество прочитанных элементов:

DT[DT[,toString(unique(scan(text = v2,sep = ",",quiet = T))),by=v1],on="v1"]
   v1             v2                 V1
1:  a 12,13,12,12,10         12, 13, 10
2:  b    10,10,11,12 10, 11, 12, 13, 14
3:  b 10,10,13,14,12 10, 11, 12, 13, 14

DT[DT[,toString(unique(unlist(strsplit(v2,",")))),by=v1],on="v1"]
   v1             v2                 V1
1:  a 12,13,12,12,10         12, 13, 10
2:  b    10,10,11,12 10, 11, 12, 13, 14
3:  b 10,10,13,14,12 10, 11, 12, 13, 14

Использование paste и unlist

 DT[DT[,.(V5=paste(unique(unlist(strsplit(v2,","))),collapse=",")),by=v1],on="v1"]
   v1             v2             V5
1:  a 12,13,12,12,10       12,13,10
2:  b    10,10,11,12 10,11,12,13,14
3:  b 10,10,13,14,12 10,11,12,13,14
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...