2013-07-16 78 views
0

鉴于数据,看起来像这样:组合几个行变量

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 

我怎么会去一些相结合,例如“税收”元素 - 如果我想结合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 
+0

ABC被称为变量? – Metrics

回答

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

一个不错的选择使用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 
1

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

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