我有很多不同长度的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
尝试了几种方法,但没有一种方法可行。 谢谢!
答案 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