Определить те же списки в списке (как переменную) в data.table - PullRequest
1 голос
/ 30 января 2020

Я упорядочил свои данные в data.table и создал столбец livar, который содержит список или иногда список со списками. Каждая строка представляет несколько записей для уникальной записи. Столбец livar агрегирует все наблюдения переменной (больше не data.table) уникальной записи в списке или когда имеется несколько записей для записи, а затем в списке списков.

Теперь я хочу проверить, совпадают ли все списки одной строки в столбце livar. В представленном коде я ожидал, что первая строка в столбце same будет FALSE, а вторая и третья - TRUE. Как показывают следующие строки, код работает, как я ожидал, но не в контексте data.table. Кто-нибудь может здесь помочь?

a <- c(123456, NA, 456789, NA, NA)
b <- c(NA, NA)
c <- c(123456, NA, 987654, NA, NA)
d <- c(123456, NA, 987654, NA, NA)
e <- c(NA, NA)

li1 <- list(a, b)
li2 <- list(c, d)

DT <- data.table(c(1,2,3))
DT[, livar := list(li1, li2, e)]
DT[, same := length(unique(livar))==1] # FALSE

length(unique(li1))==1 # FALSE
length(unique(li2))==1 # TRUE
length(unique(e))==1 # TRUE
length(unique(c(NA, NA)))==1 # TRUE

1 Ответ

1 голос
/ 31 января 2020

Как отметили chinsoon12, в следующей строке отсутствует * apply, чтобы попасть в каждый список списка.

DT[, same := sapply(livar, function(x) length(unique(x))==1L)]
...