在R语言中判断列表列内是否存在指定值的问题
问题解析与解决方法
为什么%in%不生效?
%in%(以及is.element())是向量级别的匹配工具,它会把左侧的整个A列向量和右侧的整个B列列表对象做全局匹配,而非逐行检查每行的A值是否存在于该行对应的B向量中。你的代码里,A的单个值并没有出现在B列的顶层集合里,所以所有行都返回0。
解决方法
方法1:用rowwise()实现逐行匹配
通过rowwise()让dplyr按行处理数据,此时每行的A是单个值,B是对应行的向量,再用%in%就能正确匹配:
library(dplyr) df %>% rowwise() %>% mutate(C = as.integer(A %in% B)) %>% ungroup()
(注:as.integer()可以替代ifelse(...,1,0),逻辑值TRUE会转成1,FALSE转成0)
方法2:用purrr的映射函数逐行处理
利用purrr::map2_int对每行的A和B进行配对检查,直接返回整数结果:
library(dplyr) library(purrr) df %>% mutate(C = map2_int(A, B, ~as.integer(.x %in% .y)))
方法3:基础R实现(无需额外包)
用apply逐行遍历数据框,自定义函数完成检查:
df$C <- apply(df, 1, function(row) as.integer(row[1] %in% row[2]))
执行以上任意一种方法后,都能得到你期望的结果:
| A | B | C |
|---|---|---|
| '1' | c('1', '3', '9') | 1 |
| '2' | c('1', '2', '5') | 1 |
| '3' | c('4', '5') | 0 |
| '4' | c('1', '2', '5') | 0 |
| '5' | c('1', '2', '5') | 1 |
内容的提问来源于stack exchange,提问作者Bea
相关产品推荐
相关产品推荐

