如果行中的其他两个值相互匹配,是否创建一个新变量来比较行中的值?

Creating a new variable to compare values in rows if two other values in the row match each other?

我有两个不同的数据集。我正在尝试创建代码来检查数据集 1 中 A 列和 B 列的值与数据集 2 中 A 列和 B 列的值,然后将数据集 2 的 C 列与数据集 1 的 C 列进行比较以查看哪个值是更大。因此,如果 Dataset1$A = Dataset2$A AND 如果 Dataset1$B = Dataset2$B,则比较相应行的 Dataset1$C 和 Dataset2$C。如果 Dataset1$C >= Dataset2$C,则需要 return 值为 0(写入数据集 2 的新列),如果 Dataset1$C < Dataset2$C,则需要 return 值为 1。例如,如果我有这两个表:

数据集 1

一个 B C
杰西 10/2 4:10
詹姆斯 10/3 6:11
瑞克 6/2 3:33

数据集 2

一个 B C
詹姆斯 10/5 4:02
贾法尔 10/4 2:05
杰西 10/2 7:10

Rick 和 6/2 没有比赛,James 和 10/3 没有比赛,但是 Jessie 和 10/2 有比赛。所以这个函数理想地比较 4:10 和 7:10,确定 7:10 更大,因此 return 数据集 2 的新列 D 中的 1,但是 return NA 对于其他两行。我觉得这应该可以在 R 中使用 ifelse 和可能的循环,鉴于我正在处理的数据量,我非常需要它,但我无法弄清楚。

这里是 dplyr 包的解决方案:

  1. 通过 A 列执行 full_join 以使用 case_when(您的逻辑)变异列 D
  2. 重新加入 semi_join 以获得你的 df2 列 D
library(dplyr)

df1 %>% 
    full_join(df2, by="A", keep= TRUE) %>% 
    mutate(D = case_when(
        A.x == A.y & B.x == B.y & C.x >= C.y ~ 0,
        A.x == A.y & B.x == B.y & C.x < C.y ~ 1,
        TRUE ~ NA_real_)) %>% 
    select(A=A.y, B=B.y, C=C.y, D) %>% 
    semi_join(df2, by="A")

输出:

       A    B    C  D
1 Jessie 10/2 7:10  1
2  James 10/5 4:02 NA
3  Jafar 10/4 2:05 NA

数据:

df1 <- structure(list(A = c("Jessie", "James", "Rick"), B = c("10/2", 
"10/3", "6/2"), C = c("4:10", "6:11", "3:33")), class = "data.frame", row.names = c(NA, 
-3L))

df2 <- structure(list(A = c("James", "Jafar", "Jessie"), B = c("10/5", 
"10/4", "10/2"), C = c("4:02", "2:05", "7:10")), class = "data.frame", row.names = c(NA, 
-3L))