如何在R中按行对比数据框嵌套列表并查找缺失值?
解决逐行对比列表列并找出缺失值的问题
你之前的方法失效,是因为setdiff()和%in%默认对整列的列表集合运算,而非逐行处理每个分组的两个列表。下面提供几种可行的实现方式:
1. 构造示例数据集
先创建匹配需求的示例数据,方便验证效果:
df <- data.frame( Group = c(1, 2, 3), Expected = I(list(c(1,2,3), c(4,5,6), c(7,8,9))), Observed = I(list(c(1,3), c(4,6), c(7))) )
2. Base R 逐行处理方案
用apply()按行遍历数据集,对每行的Expected和Observed列表单独执行setdiff():
df$Missing <- apply(df, 1, function(row) setdiff(row$Expected, row$Observed))
3. dplyr 逐行处理方案
如果习惯tidyverse语法,用rowwise()开启逐行模式后执行mutate:
library(dplyr) df <- df %>% rowwise() %>% mutate(Missing = list(setdiff(Expected, Observed))) %>% ungroup()
4. purrr 对应元素处理方案
利用purrr::map2()直接对两列的列表元素一一配对执行setdiff(),代码更简洁:
library(purrr) df$Missing <- map2(df$Expected, df$Observed, setdiff)
验证结果
执行任意一种方法后,查看数据集会得到预期的Missing列:
print(df) # Group Expected Observed Missing # 1 1 1, 2, 3 1, 3 2 # 2 2 4, 5, 6 4, 6 5 # 3 3 7, 8, 9 7 8, 9
内容的提问来源于stack exchange,提问作者EmmaV97
相关产品推荐
相关产品推荐

