在R语言中检查一个数据框的所有值是否存在于另一个数据框
解决a中ID是否存在于b中的判断问题
首先得修正你创建数据的小问题——直接把data.frame赋值给a$id会让这个列变成嵌套的data.frame类型,正确的创建方式应该是:
a <- data.frame(id = c("1-23-2", "2-3-231-2", "122-121")) b <- data.frame(id = c("1-23-2", "122-121", "12-1223-12", "1221-12"))
为什么你的原代码会出错?
a$id %in% b$id会返回一个与a行数等长的逻辑向量(这里是c(TRUE, FALSE, TRUE)),但if语句只能接受单个TRUE/FALSE值。R会默认只取向量的第一个元素来判断,同时抛出警告提示你“条件长度大于1,仅使用第一个元素”,这就导致你得到的结果完全不符合预期。
解决方案分两种情况:
1. 给a的每一行标记是否在b中存在
直接利用%in%返回的向量,结合ifelse就能逐行生成标记:
a$test <- ifelse(a$id %in% b$id, "yes", "no")
运行后a会变成:
id test 1 1-23-2 yes 2 2-3-231-2 no 3 122-121 yes
2. 检查a中所有ID是否都能在b中找到
如果你的需求是判断整体是否全部存在,而不是逐行标记,就用all()函数把逻辑向量压缩成单个判断值:
all_ids_exist <- all(a$id %in% b$id) if (all_ids_exist) { cat("所有a中的ID都能在b中找到!\n") } else { cat("有部分a中的ID不在b里!\n") }
这里因为2-3-231-2不在b中,所以会输出有部分a中的ID不在b里!。
内容的提问来源于stack exchange,提问作者Valentin
相关产品推荐
相关产品推荐

