R语言%in%匹配异常及集合元素校验问题咨询
解答你的R语言匹配问题
嗨,作为R语言新手碰到这种看似矛盾的匹配结果确实容易困惑,我来一步步帮你理清这两个问题:
Q1:为何%in%匹配失败?
问题出在%in%处理**数据框(或tbl_df)**的逻辑上:当你用单个字符串和数据框做%in%比较时,R会把数据框的每一行当作一个单独的“元素”来匹配。比如你的a是单列数据框,每一行都是一个长度为1的字符向量(比如"A0000514011"),而你要匹配的"A0000648050"是一个单独的字符串,不是一个长度为1的向量行,所以R会判定它不在a的行集合里,返回FALSE。
而你用的其他方法是针对列的元素做逐行比较:
a == "A0000648050":会对a列的每个元素逐一和目标字符串比较,找到匹配项就返回TRUEgrep("A0000648050", a):会直接搜索a列的字符内容,自然能定位到匹配的位置
要让%in%正常工作,你需要明确指定要匹配的列,而不是整个数据框:
"A0000648050" %in% a$SKD_DOCUMENT_NO # 会返回TRUE
Q2:如何简单验证a的所有元素是否都在b中?为何a %in% b返回FALSE,而setequal(a,b)返回TRUE?
验证所有元素都在b中的正确方法
同样要针对列操作,不要直接用整个数据框:
# 检查a的所有元素都在b里 all(a$SKD_DOCUMENT_NO %in% b$SKD_DOCUMENT_NO)
关于a %in% b和setequal(a,b)的差异
a %in% b:和Q1的逻辑一样,是把a的每一行和b的每一行做匹配。因为a和b的行顺序完全不同,每一行的向量(比如a的第一行是"A0000514011",b的第一行是"A0000648001")都不匹配,所以会返回一个长度为369的逻辑向量,所有元素都是FALSE(如果你直接输入a %in% b,R会输出这个向量,你看到的整体FALSE可能是因为你用了all()或者只关注了第一个元素)setequal(a,b):这个函数是判断两个对象的元素集合是否完全相等,它会忽略行的顺序,只检查所有元素是否都存在于对方中。因为你的a和b包含完全相同的元素,只是顺序不同,所以setequal()会返回TRUE。
内容的提问来源于stack exchange,提问作者Spana1645
相关产品推荐
相关产品推荐

