为何R语言中`which`命令无法识别两个相同数值?
问题
使用R语言的which函数结合==运算符比较两个向量,想要收集两者中数值相同的元素索引,但部分看似相同的数值(例如20005612212)未被识别。
用于比较的向量:
vulnIDs <- c(20005611101, 20005611102, 20005611103, 20005611104, 20005611105, 20005611106, 20005611107, 20005611108, 20005611109, 20005611110, 20005611111, 20005611112, 20005611113, 20005611114, 20005611115, 20005611116, 20005611117, 20005611118, 20005611119, 20005611120, 20005611121, 20005611122, 20005611123, 20005611124, 20005611125, 20005611126, 20005611127, 20005611128, 20005611129, 20005611130, 20005611131, 20005611132, 20005611133, 20005611134, 20005611135, 20005612201, 20005612202, 20005612203, 20005612204, 20005612205, 20005612206, 20005612207, 20005612208, 20005612209, 20005612210, 20005612211, 20005612212, 20005612213, 20005612214, 20005612215, 20005612216, 20005612217, 20005612218, 20005612219, 20005612220, 20005612221, 20005612222, 20005612223, 20005612224, 20005612225, 20005612226, 20005612227, 20005612228, 20005612229, 20005612230, 20005613301, 20005613302, 20005613303, 20005613304, 20005613305) vulns_nmp <- c(20005612206, 20005612212, 20005612218, 20005612224, 20005612230, 20005613301, 20005613302, 20005613303, 20005613304, 2000561330)
执行代码:
test <- which(vulnIDs == vulns_nmp)
得到输出:
> test [1] 41 53 65 66 67 68 69
结果未包含20005612212对应的索引47,原因是什么?
问题原因
==运算符在R中是逐元素比较,当两个向量长度不一致时,短向量会被自动循环拉长到和长向量相同的长度。- 这里
vulns_nmp长度为10,vulnIDs长度为69,所以vulns_nmp会被重复循环。vulnIDs[47]对应的是循环后的vulns_nmp[47 %% 10],也就是vulns_nmp[7],其值为20005613302,和vulnIDs[47]的20005612212不相等,因此不会被which选中。 - 额外注意:
vulns_nmp最后一个元素是2000561330,而vulnIDs中对应的是20005613305,这是笔误,但不是本次问题的核心原因。
正确实现方式
如果要找出vulnIDs中所有存在于vulns_nmp里的元素的索引,应该使用%in%运算符,它会检查长向量的每个元素是否在短向量中存在,而非逐位置循环比较:
test <- which(vulnIDs %in% vulns_nmp)
执行后会得到正确的索引,包括47。
内容的提问来源于stack exchange,提问作者Omar Velazquez
相关产品推荐
相关产品推荐

