R разбить, отсортировать, уникально, вставить в таблицу данных - PullRequest
0 голосов
/ 03 октября 2018

У меня есть таблица данных, как показано ниже.Я хотел бы разделить на '/', отсортировать результирующий список, принять уникальные значения, а затем вставить его, свернув на '/' в R. Я хотел бы добиться этого в пакетах data.table или stringr.Возможно ли это?

ввод >>

> dt<-data.table(id=c('id1','id2','id3','id4','id5'),value=c('a/b/a/b','b/a/c/a/b','c/d/c/a','a/b/b','a/a/c/b'))
> dt
    id     value
1: id1   a/b/a/b
2: id2 b/a/c/a/b
3: id3   c/d/c/a
4: id4     a/b/b
5: id5   a/a/c/b

ожидаемый вывод >>

> dt
    id     value
1: id1       a/b
2: id2     a/b/c
3: id3     a/c/d
4: id4       a/b
5: id5     a/b/c

Я попробовал следующее, но это не сработало.

> dt<-dt[,value1:=paste(sort(unique(unlist(strsplit(value, "/")))),collapse='/')]
> dt
    id     value  value1
1: id1   a/b/a/b a/b/c/d
2: id2 b/a/c/a/b a/b/c/d
3: id3   c/d/c/a a/b/c/d
4: id4     a/b/b a/b/c/d
5: id5   a/a/c/b a/b/c/d

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

> dt<-dt[,list(value1=paste(sort(unique(unlist(strsplit(value,"/")))),collapse='/')),by=c('id','value')]
> dt
    id     value value1
1: id1   a/b/a/b    a/b
2: id2 b/a/c/a/b  a/b/c
3: id3   c/d/c/a  a/c/d
4: id4     a/b/b    a/b
5: id5   a/a/c/b  a/b/c

Есть ли более простой способ сделать это?

1 Ответ

0 голосов
/ 03 октября 2018

Один из вариантов - разделить «значение» на /, сгруппировать по «id», получить значения sort ed unique и paste вместе

dt[, .(value = paste(sort(unique(unlist(strsplit(value, "/")))), collapse="/")), id]
#    id value
#1: id1   a/b
#2: id2 a/b/c
#3: id3 a/c/d
#4: id4   a/b
#5: id5 a/b/c

если столбцов много, то мы можем обновить «значение», просматривая элементы split и выполняя sort/unique/paste внутри каждого list

dt[, value := unlist(lapply(strsplit(value, "/"), 
        function(x) paste(sort(unique(x)), collapse="/")))]
...