如何在R中连接数据帧而不复制原始数据值

问题描述 投票:1回答:1

我有2个数据框(DF1DF2),1个想通过一个名为"acc_num"的独特值将它们连接在一起。在DF2,由acc_num AB三次付款。数据帧如下。

DF1:

 acc_num     total_use    sales
    A           433        145
    A            NA          2
    A            NA         18
    B           149         32

DF2:

   acc       payment   
    A           150
    A            98
    B            44
    B            15
    B            10

我想要的输出是:

 acc_num    total_use    sales    payment
    A            433       145       150
    A             NA         2        98
    A             NA        18        NA
    B            149        32        44
    B             NA        NA        15
    B             NA        NA        10

我已经尝试过full_joinmerge,但输出并不理想。我无法解决这个问题,因为我还是R的初学者,并没有找到解决方案。

我使用的代码示例是

test_full_join <- DF1 %>% full_join(DF2, by = c("acc_num" = "acc"))

显示的输出是:

 acc_num       total_use   sales     payment
    A             433       145        150
    A             433       145         98
    A              NA         2        150
    A              NA         2         98
    A              NA        18        150
    A              NA        18         98
    B             149        32         44
    B             149        32         15
    B             149        32         10

这与我最终的期望输出相反,我担心的是得到total_usesalespayment的总和。这个输出肯定会给我错误的数据可视化解释。

r join row-number
1个回答
0
投票

我们可能需要根据'acc_num'进行row_number()的加入

library(dplyr)
df1 %>%
     group_by(acc_num) %>%
     mutate(grpind = row_number()) %>% 
     full_join(df2 %>% 
                   group_by(acc_num = acc) %>%
                   mutate(grpind = row_number())) %>%
     select(acc_num, total_use, sales, payment)
# A tibble: 6 x 4
# Groups:   acc_num [2]
#  acc_num total_use sales payment
#  <chr>       <int> <int>   <int>
#1 A             433   145     150
#2 A              NA     2      98
#3 A              NA    18      NA
#4 B             149    32      44
#5 B              NA    NA      15
#6 B              NA    NA      10

data

df1 <- structure(list(acc_num = c("A", "A", "A", "B"), total_use = c(433L, 
NA, NA, 149L), sales = c(145L, 2L, 18L, 32L)), class = "data.frame",
   row.names = c(NA, 
-4L))

df2 <- structure(list(acc = c("A", "A", "B", "B", "B"), payment = c(150L, 
98L, 44L, 15L, 10L)), class = "data.frame", row.names = c(NA, 
-5L))
© www.soinside.com 2019 - 2024. All rights reserved.