连接具有不同长度的数据帧

时间:2017-06-26 21:10:25

标签: r dataframe merge concatenation

我有很多不同长度的data.frames,我想通过R中的row.names逐个连接它们,如果一个data.frame错过了一些名字,那么用0填充该值。例如

DF1

A 1
B 1
C 1
D 1

DF2

C 2
D 2
E 2

我想要的是

New_df

A 1 0
B 1 0
C 1 2
D 1 2
E 0 2

尝试了几种方法,但没有一种方法可行。 谢谢!

4 个答案:

答案 0 :(得分:2)

由于OP希望合并许多 data.frames,因此使用Reduce是有意义的。首先,您必须将dfs放在列表中并使用Reduce,如下所示:

df1 <- read.table(text="ID Val1
A 1
B 1
C 1
D 1",header=TRUE,stringsAsFactors=FALSE)

df2 <- read.table(text="ID Val2
C 2
D 2
E 2",header=TRUE,stringsAsFactors=FALSE)

df3 <- read.table(text="ID Val3
C 2
D 2
F 4",header=TRUE,stringsAsFactors=FALSE)

df_list <- list(df1,df2,df3)

res <- Reduce(function(x, y) merge(x, y, by="ID", all=TRUE), df_list)
res[is.na(res)] <- 0

  ID Val1 Val2 Val3
1  A    1    0    0
2  B    1    0    0
3  C    1    2    2
4  D    1    2    2
5  E    0    2    0
6  F    0    0    4

答案 1 :(得分:1)

对于要合并的数据帧数超过2个的情况:

df1 <- read.table(text="A 1
                  B 1
                  C 1
                  D 1", stringsAsFactor=F)

df2 <- read.table(text="C 2
                  D 2
                  E 2", stringsAsFactor=F)

dfs <- list(df1, df2)
df_new <- Reduce(function(...) merge(..., all=T, by="V1"), dfs)
df_new[is.na(df_new)] <- 0

答案 2 :(得分:-1)

col1<-c("A", "B", "C","D")
col2<-c(1,1,1,1)
df1<-data.frame(col1, col2)

col1<-c("C", "D", "E")
col2<-c(2,2,2)
df2<-data.frame(col1, col2)


df3<-rbind(df1, df2)
df4<-data.frame(unique(df3$col1))
colnames(df4)[1]<-"ID"
df5<-left_join(df4, df1, by=c("ID"="col1"))
df6<-left_join(df5,df2, by=c("ID"="col1"))
df6[is.na(df6)] <- 0

答案 3 :(得分:-1)

略微修改rsmith45的答案:

library(tidyverse)
df1 <-
  data_frame(id = c("A", "B", "C", "D"),
             val_1 = c(1, 1, 1, 1))
df2 <-
  data_frame(id = c("C", "D", "E"),
             val_2 = c(2, 2, 2))

new_df <- full_join(df1, df2) %>%
  replace_na(list(val_1 = 0, val_2 = 0))

> new_df
# A tibble: 5 x 3
     id val_1 val_2
  <chr> <dbl> <dbl>
1     A     1     0
2     B     1     0
3     C     1     2
4     D     1     2
5     E     0     2

replace_na很酷,因为您可以根据列使用它来填充其他值的NAs:

new_df <- full_join(df1, df2) %>%
  replace_na(list(val_1 = -99, val_2 = -1))

> new_df
# A tibble: 5 x 3
     id val_1 val_2
  <chr> <dbl> <dbl>
1     A     1    -1
2     B     1    -1
3     C     1     2
4     D     1     2
5     E   -99     2