考虑 merge 再次,你可以指定 all.x (即, LEFT JOIN )保留原始数据。以下用途 within 和 transform 作为上下文管理器添加/更新 结果 列并返回更新的数据框:
merge
all.x
LEFT JOIN
within
transform
final_df <- within(merge(DF, transform(Compare, result = "match"), all.x=TRUE), result <- ifelse(is.na(result), "no match", "match")) final_df # A B C D E result # 1 1 1 5 1 4 no match # 2 4 5 6 2 2 match # 3 5 4 3 3 3 no match # 4 6 2 2 4 4 no match
apply(DF,1,paste,collapse=" ") %in% apply(Compare,1,paste,collapse=" ") [1] FALSE TRUE FALSE FALSE
这有点作弊,因为apply本身就是一个循环,但这仍然比你的解决方案更快:
Unit: microseconds expr min lq mean median uq max neval cld iod 375.289 488.41 627.6017 570.742 705.7295 2050.474 100 a op 9070.273 10491.32 14143.7312 11770.471 15281.4865 96645.749 100 b
这将在baseR中工作
DF[ do.call("paste", DF) %in% do.call("paste", Compare), ] # A B C D E # 2 4 5 6 2 2
要不就:
do.call("paste", DF) %in% do.call("paste", Compare) #[1] FALSE TRUE FALSE FALSE