如何在R语言中识别数据框或矩阵中含指定列值对的行
解决矩阵中匹配指定值对行号的问题
原代码的问题在于,%in%是分别对两列做独立匹配,只要第一列在目标第一列集合、第二列在目标第二列集合就会被选中,这会包含像(1,4)这种交叉组合的非目标行。要实现整行值对完全匹配,可以通过把每行的多列值合并成单一标识,再用%in%匹配,以下是两种简单方法:
方法1:字符串拼接匹配
把每行的两列值用分隔符拼接成字符串,将目标值对也做同样处理,再用%in%匹配:
testmat = rbind(c(1,1), c(1,2), c(1,4), c(2,1), c(2,4), c(3,4), c(3,10)) of_interest = rbind(c(1,2), c(2,4)) # 生成每行的字符串标识 test_pairs <- paste(testmat[, 1], testmat[, 2], sep = "_") interest_pairs <- paste(of_interest[, 1], of_interest[, 2], sep = "_") # 获取匹配行的位置 which(test_pairs %in% interest_pairs)
运行结果为[1] 2 5,符合预期。
方法2:用interaction生成交互项匹配
interaction函数可以将多列值转换为唯一的交互因子,本质也是对行组合做标识:
test_inter <- interaction(testmat[, 1], testmat[, 2]) interest_inter <- interaction(of_interest[, 1], of_interest[, 2]) which(test_inter %in% interest_inter)
同样会返回正确的行号[1] 2 5。
补充:为什么原代码出错
原代码which(testmat[, 1] %in% of_interest[, 1] & testmat[, 2] %in% of_interest[, 2])的逻辑是:
- 第一列值属于
c(1,2)且 第二列值属于c(2,4)
这会把(1,4)(1在目标第一列,4在目标第二列)也纳入结果,而我们需要的是行的完整值对与目标值对完全一致,所以必须把行作为整体来判断匹配。
内容的提问来源于stack exchange,提问作者Max
相关产品推荐
相关产品推荐

