我有两个数据框:
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中的其他软件包吗?
答案 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
应该相同。因此,我使用binding
在rbind_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)
您可以使用基本函数aggregate
和rbind
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
干杯。