如何使用dplyr或其他包组合两个数据帧?

时间:2014-10-23 03:07:06

标签: r dplyr

我有两个数据框:

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 个答案:

答案 0 :(得分: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。这里,所有数据集的column names应该相同。因此,我使用bindingrbind_list数据集之前更改它。如果names不同,则每个name会有多列。加入数据集后,请按index对其进行分组,然后使用summarize并执行sum列的n

 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))

答案 1 :(得分: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

答案 2 :(得分: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

干杯。