确定R中数据集中缺少的观测值(而不是NA)

Soi*_*Guy 3 select r filter data.table

我有一个相当大的数据集,其中包含近6000个观测值.我提供了另一个缺少观察结果的数据集.如果没有进行测量,则不用NA填充行/观测值,而是省略整行/观察.第二个数据集有5500行.

我需要确定哪些观察结果未被记录,或者换句话说,哪些行在第二个数据集中缺失.我不是指NAs或缺少值,而是指未进入数据集的观察.

在下面的例子中,每个观察(ID)也应该有11,12,13,14,21,22,23,24的"组"记录.但是,ID 206902只有11,12,14,21,22组,23,24.它缺少了13

在这个例子中,ID并不是真正唯一的,所以应该有8个ID.例如,ID 206901&group 11; ID 206901和第12组等

如何轻松确定缺少哪些观察结果(ID)?同样,每个ID应该有8条记录.

example <- structure(list(ID = c(206901L, 206901L, 206901L, 206901L, 206901L, 
206901L, 206901L, 206901L, 206902L, 206902L, 206902L, 206902L, 
206902L, 206902L, 206902L), group = c(11L, 12L, 13L, 14L, 21L, 
22L, 23L, 24L, 11L, 12L, 14L, 21L, 22L, 23L, 24L)), .Names = c("ID", 
"group"), sorted = "ID", class = c("tbl_dt", "tbl", "data.table", 
"data.frame"), row.names = c(NA, -15L), .internal.selfref = <pointer: 0x0000000000100788>)
Run Code Online (Sandbox Code Playgroud)

akr*_*run 5

目前尚不清楚预期的输出是什么,但如果我们需要在所有唯一的"组"中列出特定ID中所有缺失的"组",那么我们可以使用%in%!获取"组"的逻辑索引即缺少由"ID"分组,并且通过使用逻辑索引"I1"返回缺失"基团" ifany丢失的组或else返回"NA".

Un <- unique(example[["group"]])
example[, {i1 <- !Un %in% group
           list(NotFound = if(any(i1)) Un[i1] else NA_integer_) 
          }, ID]
#       ID NotFound
#1: 206901       NA
#2: 206902       13
Run Code Online (Sandbox Code Playgroud)

或者正如@Frank所提到的,我们可以交叉连接(CJ)unique'ID'和'group'列中的元素,join输出'example' on为'ID','group'列,将'i'指定为否定(!)'example'只输出'example'中找不到的元素

example[, CJ(ID=ID, group=group, unique=TRUE)
                     ][!example, on = c("ID", "group")]
Run Code Online (Sandbox Code Playgroud)