Dplyr,将连续的数据帧连接到预先存在的列,对其值求和

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

我想从相同的源每次都使用不同的ID来执行对原始数据帧的多次联接。具体来说,我实际上只需要执行两个联接,但是当我执行第二次联接时,要联接的列已经存在于输入df中,而不是使用.x / .y后缀添加这些具有新名称的列,我想将值加到现有列中。请参阅下面的代码以获取所需的输出。

# Input data:
values <- tibble(
  id = LETTERS[1:10],
  variable1 = 1:10,
  variable2 = (1:10)*10
)
df <- tibble(
  twin_id = c("A/F", "B/G", "C/H", "D/I", "E/J")
)
> values
# A tibble: 10 x 3
   id    variable1 variable2
   <chr>     <int>     <dbl>
 1 A             1        10
 2 B             2        20
 3 C             3        30
 4 D             4        40
 5 E             5        50
 6 F             6        60
 7 G             7        70
 8 H             8        80
 9 I             9        90
10 J            10       100
> df
# A tibble: 5 x 1
  twin_id
  <chr>  
1 A/F    
2 B/G    
3 C/H    
4 D/I    
5 E/J  

所以这是两个联接:

joined_df <- df %>%
  tidyr::separate(col = twin_id, into = c("left_id", "right_id"), sep = "/", remove = FALSE) %>%
  left_join(values, by = c("left_id" = "id")) %>%
  left_join(values, by = c("right_id" = "id"))

> joined_df
# A tibble: 5 x 7
  twin_id left_id right_id variable1.x variable2.x variable1.y variable2.y
  <chr>   <chr>   <chr>          <int>       <dbl>       <int>       <dbl>
1 A/F     A       F                  1          10           6          60
2 B/G     B       G                  2          20           7          70
3 C/H     C       H                  3          30           8          80
4 D/I     D       I                  4          40           9          90
5 E/J     E       J                  5          50          10         100

这是我想要的输出,使用我看到的唯一方式即可获得它:

output_df_wanted <- joined_df %>%
  mutate(
    variable1 = variable1.x + variable1.y,
    variable2 = variable2.x + variable2.y) %>%
  select(twin_id, left_id, right_id, variable1, variable2)

> output_df_wanted
# A tibble: 5 x 5
  twin_id left_id right_id variable1 variable2
  <chr>   <chr>   <chr>        <int>     <dbl>
1 A/F     A       F                7        70
2 B/G     B       G                9        90
3 C/H     C       H               11       110
4 D/I     D       I               13       130
5 E/J     E       J               15       150

我可以看到如何使用mutate语句获得所需的信息,但实际上数据集中会有更多的变量。我想知道这是否是最好的方法。

r join merge dplyr tidyverse
1个回答
0
投票

您可以尝试重塑数据并使用dplyr::summarise

library(tidyr)
library(dplyr)

df %>%
  separate(col = twin_id, into = c("left_id", "right_id"), sep = "/", remove = FALSE) %>%
  pivot_longer(-twin_id) %>% 
  left_join(values, by = c("value" = "id")) %>% 
  group_by(twin_id) %>% 
  summarise(
    variable1 = sum(variable1),
    variable2 = sum(variable2)
  ) %>% 
  separate(col = twin_id, into = c("left_id", "right_id"), sep = "/", remove = FALSE)
## A tibble: 5 x 5
#  twin_id left_id right_id variable1 variable2
#  <chr>   <chr>   <chr>        <int>     <dbl>
#1 A/F     A       F                7        70
#2 B/G     B       G                9        90
#3 C/H     C       H               11       110
#4 D/I     D       I               13       130
#5 E/J     E       J               15       150
© www.soinside.com 2019 - 2024. All rights reserved.