根据行值合并两个数据帧

时间:2014-09-08 03:08:27

标签: r dataframe reshape

我有两个数据框,每个数据框都有相同的两列:县代码和频率。它们不相同,但是一些县代码值显示在两个数据框中。像这样:

"county_code","freq"
"01011",2
"01051",1
"01073",9
"01077",1

"county_code","freq"
"01011",4
"01056",2
"01073",1
"01088",6

我想将它们合并到一个新的数据框中,这样如果县代码出现在两个数据框中,它们各自的频率就会加在一起。如果县代码只出现在一个或另一个数据框中,我想将它(及其频率)添加到新数据框中不变。结果应如下所示:

"county_code","freq"
"01011",6
"01051",1
"01056",2
"01073",10
"01077",1
"01088",6

不必订购结果。我尝试使用reshape,但我不确定这是正确的方法。想法?

3 个答案:

答案 0 :(得分:5)

将两个数据框与rbind合并,然后使用aggregate折叠多个行county_code

aggregate(freq~county_code, rbind(d1, d2) , FUN=sum)
##   county_code freq
## 1        1011    6
## 2        1051    1
## 3        1073   10
## 4        1077    1
## 5        1056    2
## 6        1088    6

(使用MrFlick答案中的定义。)

答案 1 :(得分:1)

这是一种方法。我使用了rbind()merge()dplyr

# sample data
country <- c("01011", "01051", "01073", "01077")
value <- c(2,1,9,1)
foo <- data.frame(country, value, stringsAsFactors=F)


country <- c("01011","01056","01073","01088")
value <- c(4,2,1,6)
foo2 <- data.frame(country, value, stringsAsFactors=F)

library(dplyr)

group_by(rbind_list(foo, foo2), country) %>%
summarize(count = sum(value))

ana

  country count
1   01011     6
2   01051     1
3   01056     2
4   01073    10
5   01077     1
6   01088     6

我的另一个想法是以下内容。

ana2 <- merge(foo, foo2, all = TRUE, by = "country") 

  country value.x value.y
1   01011       2       4
2   01051       1      NA
3   01056      NA       2
4   01073       9       1
5   01077       1      NA
6   01088      NA       6

bob2 <- ana2 %>%
        rowwise() %>%
        mutate(count = sum(value.x,value.y, na.rm = TRUE))

  country value.x value.y count
1   01011       2       4     6
2   01051       1      NA     1
3   01056      NA       2     2
4   01073       9       1    10
5   01077       1      NA     1
6   01088      NA       6     6

答案 2 :(得分:1)

使用基本功能,您可以merge()然后transform()。这是您的示例输入data.frames

d1 <- data.frame(
    county_code = c("1011", "1051", "1073", "1077"), 
    freq = c(2L, 1L, 9L, 1L)
)

d2 <- data.frame(
    county_code = c("1011", "1056", "1073", "1088"),
    freq = c(4L, 2L, 1L, 6L)
)

然后你会做

transform(merge(d1, d2, by="county_code", all=T), 
    freq = rowSums(cbind(freq.x, freq.y), na.rm=T), 
    freq.x = NULL, freq.y = NULL
 )

获取

  county_code freq
1        1011    6
2        1051    1
3        1056    2
4        1073   10
5        1077    1
6        1088    6