Последовательный setdiff в списке данных
Используя данные, организованные как
dtl <- replicate(10,data.table(id=sample(letters,10),val=sample(10)), simplify=F)
lapply(dtl, function(x){setkey(x,'id')})
Мне нужно извлечь список таблиц данных, которые содержат строки в dtl[[n+1]]] с идентификатором, отсутствующим в dtl [[n]]. Я предполагаю, что это будет что-то вроде
dtl2 <- list(setdiff(dtl[[1]][['id']],dtl[[2]][['id']]),setdiff(dtl[[2]][['id']],dtl[[3]][['id']]...)
Обратите внимание, что хотя setdiff должен учитывать только столбец id, я ожидаю, что результат будет содержать все столбцы из каждого элемента данных.
1 ответ
Решение
Я думаю, что это сделает это для вас:
mapply(setdiff, head(dtl, -1), tail(dtl, -1), SIMPLIFY = FALSE)
Изменить: с вашим новым ожидаемым выводом, я бы все равно использовал mapply
как указано выше, но с одним из следующих двух изменений:
- замещать
setdiff
сfunction(x,y)setdiff(x$id, y$id)
- замещать
dtl
сids <- lapply(dtl, "[", "id")
Edit2:: вы снова изменили ожидаемый результат, добавив простое английское описание, которое не соответствует коду, который вы предоставили... Я думаю, что вы сейчас ищете это:
mapply(function(x,y)y[setdiff(y$id, x$id), ],
head(dtl, -1), tail(dtl, -1), SIMPLIFY = FALSE)