Последовательный 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 как указано выше, но с одним из следующих двух изменений:

  1. замещать setdiff с function(x,y)setdiff(x$id, y$id)
  2. замещать dtl с ids <- lapply(dtl, "[", "id")

Edit2:: вы снова изменили ожидаемый результат, добавив простое английское описание, которое не соответствует коду, который вы предоставили... Я думаю, что вы сейчас ищете это:

mapply(function(x,y)y[setdiff(y$id, x$id), ],
       head(dtl, -1), tail(dtl, -1), SIMPLIFY = FALSE)
Другие вопросы по тегам