【问题标题】:Creating a new variable to compare values in rows if two other values in the row match each other?如果行中的其他两个值相互匹配,则创建一个新变量来比较行中的值?
【发布时间】:2021-10-10 19:23:11
【问题描述】:

我有两个不同的数据集。我正在尝试创建代码,将数据集 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,则需要返回值 0(写入 Dataset 2 的新列),如果 Dataset1$C

数据集 1

A B C
Jessie 10/2 4:10
James 10/3 6:11
Rick 6/2 3:33

数据集 2

A B C
James 10/5 4:02
Jafar 10/4 2:05
Jessie 10/2 7:10

Rick 和 6/2 不匹配,James 和 10/3 不匹配,但 Jessie 和 10/2 匹配。因此,此函数理想情况下会将 4:10 与 7:10 进行比较,确定 7:10 更大,因此在数据集 2 的新列 D 中返回 1,但会为其他两行返回 NA。我觉得这应该可以在 R 中使用 ifelse 和可能的循环,考虑到我正在使用的数据量,我非常需要它,但我无法弄清楚。

【问题讨论】:

  • 你能展示你对这个数据集的预期输出吗?您如何将 4:107:10 进行比较?这些不是数字,而是字符串。

标签: r if-statement matching multiple-databases


【解决方案1】:

这是dplyr 包的解决方案:

  1. 通过A 列执行full_join 以将D 列更改为case_when(您的逻辑)。
  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))

【讨论】:

    猜你喜欢
    • 2019-11-22
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2022-09-09
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多