R中的聚合数据帧子集

时间:2014-09-16 22:21:40

标签: r dataframe subset aggregation

我有数据框ds

CountyID  ZipCode   Value1    Value2    Value3 ...   Value25
   1        1         0        etc        etc          etc
   2        1         3       
   3        1         0       
   4        1         1       
   5        2         2       
   6        3         3       
   7        4         7
   8        4         2       
   9        5         1       
   10       6         0       

并希望根据ds$ZipCode进行汇总,并根据最高ds$CountyIDds$Value1设置为等于主要县。对于上面的示例,它看起来像这样:

CountyID  ZipCode   Value1    Value2    Value3 ...   Value25
   2        1         4        etc        etc          etc
   5        2         2       
   6        3         3       
   7        4         9       
   9        5         1       
   10       6         0       

所有ValueX列都是按ZipCode分组的列的总和。

在过去的几天里,我尝试过一系列不同的策略,但都没有奏效。我提出的最好的是

#initialize the dataframe
ds_temp = data.frame()

#loop through each subset based on unique zipcodes
for (zip in unique(ds$ZipCode) {

    sub <- subset(ds, ds$ZipCode == zip)                                           
    len <- length(sub)                                                             
    maxIndex <- which.max(sub$Value1)                          

    #do the aggregation  
    row <- aggregate(sub[3:27], FUN=sum, by=list(                                  
        CountyID = rep(sub$CountyID[maxIndex], len),                           
        ZipCode = sub$ZipCode))                

    rbind(ds_temp, row)                                                            
}                                                                                  

ds <- ds_temp

我还没有能够在真实数据上对此进行测试,但是对于虚拟数据集(例如上面的数据集),我不断得到错误&#34;参数必须具有相同的长度)。我用rep()和固定向量(例如c(1,2,3,4))搞砸了,但不管我做什么,错误仍然存​​在。我偶尔也会遇到错误

的影响
  

不能对类型&#39;关闭&#39;

的数据进行子集化

有什么想法吗?我也尝试过使用data.frame()ddply()data.table()dcast()等等。

2 个答案:

答案 0 :(得分:2)

你可以试试这个:

data.frame(aggregate(df[,3:27], by=list(df$ZipCode), sum),
  CountyID = unlist(lapply(split(df, df$ZipCode), 
    function(x) x$CountyID[which.max(x$Value1)])))

完全可重复的样本数据:

df<-read.table(text="
CountyID  ZipCode   Value1    
   1        1         0   
   2        1         3       
   3        1         0       
   4        1         1       
   5        2         2       
   6        3         3       
   7        4         7
   8        4         2       
   9        5         1       
   10       6         0", header=TRUE)

data.frame(aggregate(df[,3], by=list(df$ZipCode), sum),
  CountyID = unlist(lapply(split(df, df$ZipCode), 
    function(x) x$CountyID[which.max(x$Value1)])))

#  Group.1 x CountyID
#1       1 4        2
#2       2 2        5
#3       3 3        6
#4       4 9        7
#5       5 1        9
#6       6 0       10

答案 1 :(得分:1)

在回答您对Frank答案的评论时,您可以使用aggregate中的公式方法保留列名称。使用Franks的数据df,这将是

> cbind(aggregate(Value1 ~ ZipCode, df, sum), 
        CountyID = sapply(split(df, df$ZipCode), function(x) {
            with(x, CountyID[Value1 == max(Value1)]) }))
#   ZipCode Value1 CountyID
# 1       1      4        2
# 2       2      2        5
# 3       3      3        6
# 4       4      9        7
# 5       5      1        9
# 6       6      0       10