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

时间:2019-04-23 06:18:15

标签: r join row-number

我有2个数据帧(DF1DF2),有1个数据帧希望通过称为"acc_num"的唯一值将它们连接在一起。在DF2中,付款由acc_num A进行两次,并由B进行三次。数据帧如下。

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的总和。 此输出肯定会给我错误的解释 以便稍后进行数据可视化。

1 个答案:

答案 0 :(得分: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

数据

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))