【问题标题】:Merge dataframes by column, if not all columns are present in all data frames in R如果不是所有列都存在于 R 中的所有数据框中,则按列合并数据框
【发布时间】:2020-12-19 22:13:29
【问题描述】:

这和这个帖子有关Combine dfs by common column importing selected columns in R

当并非所有data frames 都具有相同的列/观察值时,我想通过 df 列合并不同的 dataframes,如果它们并不常见,则显示 0。

我的数据集:

df <- data.frame(names=c("Obs1", "Obs2", "Obs3", "Obs4", "Obs5"), `S1`=c(1,2,2,0,1), `S2`=c(2,50,40,30,22), `S3`=c( 0,100,135,256,303), `S4`=c(0,10,17,73,74),check.names=FALSE)
df2<- data.frame(names=c("Obs1",  "Obs3", "Obs4", "Obs5"), `S1`=c(0,30,40,2), `S2`=c(2,5,6,7))
df3<- data.frame(names=c("Obs1", "Obs2", "Obs3", "Obs4", "Obs5"), `S1`=c(100,300,300,400,200), `S2`=c(3,5,7,8,7))
df4<- data.frame(names=c("Obs1", "Obs2", "Obs3","Obs6"), `S1`=c(110,310,310,210), `S2`=c(30,50,70,70))

我想要的输出:

当我运行它时,它只采用所有数据框中的常见列名/观察值,并忽略部分但不是全部中的列名/观察值。

dff <- df %>% inner_join(df2 %>% select(names, 'S1_df2' = S1)) %>% 
          inner_join(df3 %>% select(names, 'S1_df3' = S1)) %>% 
          inner_join(df4 %>% select(names, 'S1_df4' = S1))

dff
    
  names S1  S2  S3  S4  S1_df2 S1_df3 S1_df4
1 Obs1  1   2   0   0   0      100    110 
2 Obs3  2   40  135 17  30     300    310

改为所需的输出:

names   S1  S2  S3   S4  S1_df2 S1_df3 S1_df4
1 Obs1  1   2   0    0   0      100    110 
2 Obs2  2   50  100  10  0      300    310  # this Obs is not present in df2, therefore add 0
3 Obs3  2   40  135  17  30     300    310
4 Obs4  0   30  256  73  40     400    0    # this Obs is not present in df4, therefore add 0
5 Obs5  1   22  303  74  2      200    0    # this Obs is not present in df4, therefore add 0
6 Obs6  0   0   0    0   0      0      210  # this Obs is not present in df1,2,3,therefore add 0

【问题讨论】:

    标签: r dataframe dplyr


    【解决方案1】:

    我们可以将inner_join 更改为full_join,然后将replace NA 更改为0

    library(dplyr)
    library(tidyr)
    df %>%
           full_join(df2 %>% 
                       select(names, 'S1_df2' = S1)) %>% 
           full_join(df3 %>% 
                       select(names, 'S1_df3' = S1)) %>% 
            full_join(df4 %>% 
                      select(names, 'S1_df4' = S1)) %>%    
            mutate(across(S1:S1_df4, replace_na, 0))
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2014-10-22
      • 1970-01-01
      • 2018-09-27
      • 2021-08-14
      • 2021-07-22
      • 1970-01-01
      • 2021-07-28
      • 1970-01-01
      相关资源
      最近更新 更多