【发布时间】: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
【问题讨论】: