合并几个行变量

时间:2013-07-16 00:39:09

标签: r

给出如下数据:

Year<-c(1,1,1,1,2,2,2,2,3,3,3,3)
Tax<-c('A','B','C','D','A','B','C','D','A','B','C','D')
Count<-c(1,2,1,2,1,2,1,1,1,2,1,1)
Dummy<-data.frame(Year,Tax,Count)

 Dummy
  Year  Tax Count
1   1   A     1
2   1   B     2
3   1   C     1
4   1   D     2
5   2   A     1
6   2   B     2
7   2   C     1
8   2   D     1
9   3   A     1
10  3   B     2
11  3   C     1
12  3   D     1

如何组合一些“Tax”元素 - 例如,如果我想将A,B,C组合成一个新的变量“ABC”。我的最终结果应该是这样的

Year Tax Count
  1   ABC  4
  1    D   2
  2   ABC  4
  2    D   1
  3   ABC  4
  3    D   1

3 个答案:

答案 0 :(得分:3)

另一个plyr解决方案。只需重新定义您的Tax变量并进行正常摘要。

ddply(within(Dummy, {
    Tax <- ifelse(Tax %in% c('A','B','C'), 'ABC', 'D')
}), .(Year, Tax), summarise, Count=sum(Count))

如果你没有plyr(或者不喜欢它(!)),这个问题很简单,可以直接在基础R中处理。

aggregate(Count ~ Year + Tax, within(Dummy, {
    Tax <- ifelse(Tax %in% c('A','B','C'), 'ABC', 'D')
}), sum)

答案 1 :(得分:1)

这是使用ddply

的选项
ddply(Dummy,.(Year),summarise,
           Tax=c(Reduce(paste0,head(Tax,-1)),as.character(tail(Tax,1))),
           Count=c(sum(head(Count,-1)),tail(Count,1)))

 Year Tax Count
1    1 ABC     4
2    1   D     2
3    2 ABC     4
4    2   D     1
5    3 ABC     4
6    3   D     1

答案 2 :(得分:1)

好吧,这是一个比原来更好的解决方案。没有空数据帧,没有rbind,但它仍然可以处理任意组:

groups_list = list(c("A", "B", "C"), "D")
Dummy$TaxGroup = sapply(Dummy$Tax, function(tax_value) {
  group_search = sapply(groups_list, function(group) tax_value %in% group)
  group_num = which(group_search)
})
combined = ddply(
  Dummy,
  .(Year, TaxGroup),
  summarize,
  GroupName=paste(groups_list[[TaxGroup[1]]], sep="", collapse=""),
  CombinedCount=sum(Count)
)