如何使用dplyr或其他包合并两个数据框?

3

我有两个数据框:

df1 = data.frame(index=c(0,3,4),n1=c(1,2,3))  
df1
#  index n1
# 1    0  1
# 2    3  2
# 3    4  3

df2 = data.frame(index=c(1,2,3),n2=c(4,5,6))  
df2
#   index n2
# 1     1  4
# 2     2  5
# 3     3  6

我想将它们合并起来:
  index n
1     0 1
2     1 4
3     2 5
4     3 8  (index 3 in two df, so add 2 and 6 in each df)
5     4 3
6     5 0  (index 5 not exists in either df, so set 0)
7     6 0  (index 6 not exists in either df, so set 0)

给定的数据框只是大型数据集的一部分。我可以使用dplyr或其他R软件包吗?

3个回答

2

使用 data.table (对于更大的数据集效率更高)。我没有更改列名称,因为 rbindlist 使用第一个数据集的名称,即在本例中是第二列的 n(不知道这是特性还是错误)。一旦你通过 rbindlist 连接了数据集,按列 index 分组,即 (by=index) 并对 n 列求和 (list(n=sum(n)) )

 library(data.table)
 rbindlist(list(data.frame(index=0:6,n=0), df1,df2))[,list(n=sum(n)), by=index]
     index n
 #1:     0 1
 #2:     1 4
 #3:     2 5
 #4:     3 8
 #5:     4 3
 #6:     5 0
 #7:     6 0

或者使用dplyr。在这里,所有数据集的列名应该相同。所以,在使用rbind_list绑定数据集之前,我会先更改它。如果names不同,每个name将有多个列。在连接数据集后,按index分组,然后使用summarize对列n进行sum

 library(dplyr)
 nm1 <- c("index", "n") 
 colnames(df1) <- colnames(df2) <- nm1 
 rbind_list(df1,df2, data.frame(index=0:6, n=0)) %>% 
                                          group_by(index) %>%
                                          summarise(n=sum(n))

0

你可以使用基本函数aggregaterbind来完成这个任务。

df1 = data.frame(index=c(0,3,4),n=c(1,2,3))  
df2 = data.frame(index=c(1,2,3),n=c(4,5,6))  
aggregate(n~index, rbind(df1, df2, data.frame(index=0:6, n=0)), sum)

它返回

  index n
1     0 1
2     1 4
3     2 5
4     3 8
5     4 3
6     5 0
7     6 0

0

怎么样?

names(df1) <- c("index", "n")                # set colnames of df1 to target
df3 <- rbind(df1,setNames(df2, names(df1)))  # set colnnames of df2 and join
df <- df3 %>% dplyr::arrange(index)          # sort by index

干杯。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接