我有以下数据框:
T1 T2 T3 R1 R2 R3
3 4 2 3 2 1
6 4 2 2 1 4
8 7 6 6 7 8
我试图将第一组数字(T1,T2,T3)的组合与第二组(R1,R2,R3)相匹配,以查看是否存在匹配。
例如:
线路1:
T1,T2,T3的第一部分中的数字是3,4,2
R1,R2,R3的第二部分中的数字是3,2,1
所以这里没有匹配。
Line2(也不匹配)
行3: T1,T2,T3的第一部分中的数字是8,7,6
R1,R2,R3的第二部分中的数字是6,7,8
这里有匹配,因为两个部分都存在所有三个数字(顺序无关紧要)。
期望的输出:
T1 T2 T3 R1 R2 R3 MATCH
3 4 2 3 2 1 No Match
6 4 2 2 1 4 No Match
8 7 6 6 7 8 Match
到目前为止,我已尝试使用match
并将每种组合合并,但我被卡住了。
答案 0 :(得分:3)
如果前三列中的所有元素都存在于最后三行中,我们可以使用Person
来检查每一行(MARGIN = 1)。在apply
中使用此选项可获取所需的字符串。
ifelse
答案 1 :(得分:1)
选项是将apply
与MARGIN = 1
一起使用,然后将前3个元素与接下来的3个元素进行比较,并将其与all
c("No Match", "Match")[apply(df1, 1, function(x) all(sort(x[1:3]) == sort(x[4:6]))) + 1]
#[1] "No Match" "No Match" "Match"
或另一个选项是tidyverse
library(tidyverse)
rownames_to_column(df1, 'rn') %>%
gather(key, val, -rn) %>%
group_by(rn) %>%
summarise(MATCH = all(sort(val[str_detect(key, "^T")]) ==
sort(val[str_detect(key, "^R")]))) %>%
pull(MATCH) %>%
bind_cols(df1, MATCH = .)
注意:最好保持逻辑(TRUE / FALSE)而不是Match/No Match