gpt4 book ai didi

r - 如何保留原始列以在 r 中两个数据库的 full_join() 中进行比较

转载 作者:行者123 更新时间:2023-12-04 07:54:25 26 4
gpt4 key购买 nike

我试图比较两个数据框以确定其中一列中的差异。为了实现这一点,我正在使用 full_join()来自 tidyverse 但我不知道如何保留数据框的来源,所以我可以理解差异。

#Two databases that differ in Charge for the name and date or also have a entirely unique rows

df1 <- tibble(Name = c("JANE,DOE", "JANE,DOE", "JIM,DOE", "JANE,BUCK", "JIM,BUCK", "JIM,BUCK"),
Date = c("1/1/21", "1/10/21", "2/1/21", "1/2/21", "2/2/21", "2/8/21"),
Charge = c(-500, -500, -450, 0, -450, 0))

df2 <- tibble(Name = c("JANE,DOE", "JANE,DOE", "JIM,DOE", "JANE,BUCK", "JIM,BUCK", "JIM,BUCK", "JIM,BUCK"),
Date = c("1/2/21", "1/10/21", "2/1/21", "1/2/21", "2/2/21", "2/8/21", "2/10/21"),
Charge = c(-500, -500, -450, -500, -500, -500, -50))
我尝试使用组合它们然后识别不同的行
Audit <- full_join(df1,df2)
Audit <- Audit %>% distinct() %>% arrange(Name, Date)
但是我的输出不允许我从 Name 和 Date 唯一的行中对比费用。
Name       Date    Charge
<chr> <chr> <dbl>
JANE,BUCK 1/2/21 0 #df2
JANE,BUCK 1/2/21 -500 #df1
JANE,DOE 1/1/21 -500 #df1
JANE,DOE 1/10/21 -500 #df1 & df2
JANE,DOE 1/2/21 -500 #df2
JIM,BUCK 2/10/21 -50 #df2
JIM,BUCK 2/2/21 -450 #df1
JIM,BUCK 2/2/21 -500 #df2
JIM,BUCK 2/8/21 0 #df1
JIM,BUCK 2/8/21 -500 #df2
JIM,DOE 2/1/21 -450 #df1
我最终想要实现的是审计生成这样的输出
Name       Date    Charge   ChargeDiff
<chr> <chr> <dbl> <dbl>
JANE,BUCK 1/2/21 0 -500 #difference in Charge when name and date are same, but Charge differs

JANE,DOE 1/1/21 -500 0 #unique df1 is 0 because we know it is valid

JANE,DOE 1/2/21 -500 -500 #unique in df2 is -500 because it is missing
JIM,BUCK 2/10/21 -50 -50 #unique in df2 is -50 because it is missing
JIM,BUCK 2/2/21 -450 50 # df1-df2 on 2/2 is -450-(-500)

JIM,BUCK 2/8/21 0 500 # df1-df2

JIM,DOE 2/1/21 -450 #df1 #unique in df1
我在获取 所需的步骤时遇到了一些麻烦ChangeDiff 列创建。 thera 是一个不同的连接选项,它允许我仅将 df2 中的唯一行添加到 Audit,但在名称和日期对齐的单独列中保留来自 df2 的唯一 Charge 值。

最佳答案

您几乎可以使用 full_join()使用 by()参数允许您控制连接,以便您可以包含两组 Charge在单独的列中。使用 dplyr::mutate()和/或 case_when()生成您的 ChargeDiff柱子。

library(tibble)
library(dplyr)
tib <-
df1 %>%
full_join(df2, by = c("Name" = "Name", "Date" = "Date")) %>%
mutate(ChargDiff = case_when(is.na(Charge.x) | is.na(Charge.y) ~ NA_real_,
TRUE ~ Charge.x - Charge.y))

tib
#> # A tibble: 8 x 5
#> Name Date Charge.x Charge.y ChargDiff
#> <chr> <chr> <dbl> <dbl> <dbl>
#> 1 JANE,DOE 1/1/21 -500 NA NA
#> 2 JANE,DOE 1/10/21 -500 -500 0
#> 3 JIM,DOE 2/1/21 -450 -450 0
#> 4 JANE,BUCK 1/2/21 0 -500 500
#> 5 JIM,BUCK 2/2/21 -450 -500 50
#> 6 JIM,BUCK 2/8/21 0 -500 500
#> 7 JANE,DOE 1/2/21 NA -500 NA
#> 8 JIM,BUCK 2/10/21 NA -50 NA
创建于 2021-03-24 由 reprex package (v1.0.0)

关于r - 如何保留原始列以在 r 中两个数据库的 full_join() 中进行比较,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/66775134/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com