Как отменить список по каждой строке и взять уникальные элементы и оригинальный размер в списке - PullRequest
0 голосов
/ 23 сентября 2019

У меня есть список в виде строки, и теперь я хочу отменить список всех элементов в строке и взять уникальные элементы.

library(data.table)
library(stringr)
Data<-data.table(
X=sample(1:10),
Y=list(c("between","between","before","pm"),c("am","in","at","am"),c("at","pm"),c("after","after","on"),c("on","am","on"),c("at","between","at"),c("at","between"),c("at","at","on"),c("pm","pm","am"),c("between","between","pm","between","pm","between","pm")))

Теперь я хочу получить уникальные элементы, а также количество элементовв списке.

Например, для первой строки в списке присутствуют 4 элемента, а «между», «до», «pm» являются уникальными элементами в списке.

Поэтому я попытался

Data[,unique_elements:=unique(Y),by=list(X)]
Data[,count:=length(Y),by=list(X)]

Но эти два дают не то, что я ожидал, не уверен, где я делаю неправильную часть.Любая помощь приветствуется.

Ответы [ 2 ]

2 голосов
/ 23 сентября 2019

Мы можем использовать lapply для получения unique значений для каждого Y и lengths для получения длины каждого элемента в Y.

library(data.table)
Data[, c("unique_vals", "count") := list(lapply(Y, unique), lengths(Y))]

Data
# X                                         Y       unique_vals    count
#1: 10                 between,between,before,pm between,before,pm     4
#2:  4                               am,in,at,am          am,in,at     4
#3:  3                                     at,pm             at,pm     2
#4:  6                            after,after,on          after,on     3
#5:  5                                  on,am,on             on,am     3
#6:  1                             at,between,at        at,between     3
#7:  8                                at,between        at,between     2
#8:  7                                  at,at,on             at,on     3
#9:  9                                  pm,pm,am             pm,am     3
#10: 2 between,between,pm,between,pm,between,...        between,pm     7

Однако это решение неспецифично для data.table, мы можем использовать dplyr

library(dplyr)
Data %>%
  mutate(unique_vals = purr::map(Y, unique), 
         count = lengths(Y))

или основание R:

Data$unique_vals <- lapply(Data$Y, unique)
Data$count <- lengths(Data$Y)
1 голос
/ 23 сентября 2019

Не- data.table результат

lapply(Data$Y,unique)

для получения уникальных строк и

lapply(Data$Y,length)

для получения количества элементов в списке.

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