将结果合并并汇总到原始数据

时间:2016-01-21 05:10:20

标签: r aggregate

我有一个数据帧df,有3个变量:id,category和quantity:

id category quantity
01 AB       235
02 BC       987
03 AB       366
04 CD       287

我想添加第四个变量,它是整个类别的总和。现在,我喜欢它:

df <- merge(df,aggregate(df$quantity,list(df$category),sum),
     by.x="category", 
     by.y="Group.1")
names(df)[4] <- "sum.category"

它有效,但我觉得它不太令人满意,可能还有更好的方法吗?

4 个答案:

答案 0 :(得分:4)

以下是data.table的另一个选项。我们转换了&#39; data.frame&#39;到&#39; data.table&#39; (setDT(df1)),按&#39;类别&#39;分组,我们分配(:=sum&#39;数量&#39;作为新列(&#39; sum.category&#39;)。

library(data.table)
setDT(df1)[,sum.category:= sum(quantity) , category]
df1
#    id category quantity sum.category
#1:  1       AB      235          601
#2:  2       BC      987          987
#3:  3       AB      366          601
#4:  4       CD      287          287

或使用base R

df1$sum.category <- with(df1, ave(quantity, category, FUN=sum))

答案 1 :(得分:3)

您可以使用init(passedData:String){ self.test = passedData super.init(nibName: /*Add your nib name here*/, bundle: nil) } 来获取总和,然后使用查找表来创建新列

tapply

答案 2 :(得分:3)

这是dplyr解决方案

df %>%
    group_by(category)                   %>% # Group by category
    mutate(sum.category = sum(quantity)) %>% # Sum by category
    ungroup                                  # Remove grouping
#Source: local data frame [4 x 4]
#
#     id category quantity sum.category
#  (int)    (chr)    (int)        (int)
#1     1       AB      235          601
#2     2       BC      987          987
#3     3       AB      366          601
#4     4       CD      287          287

ungroup并非绝对必要。

答案 3 :(得分:2)

您可以以更易读的方式使用相同的合并和聚合。将实际df与左外连接all.x = TRUE上的聚合结果合并将完成工作。我希望这更好理解。

df <- data.frame(id=c(01,02,03,04),category=c("AB","BC","AB","CD"),
                 quantity=c(235,987,366,287))

df <- merge(df,aggregate(quantity ~ category, data=df, sum),"category",all.x = TRUE)
names(df)[4] <- "sum.category"
df

#   category  id     quantity.x   sum.category
#         AB  1        235        601
#         AB  3        366        601
#         BC  2        987        987
#         CD  4        287        287

如果你还想要一种更容易理解的方式,那么sql是最好的选择。为此,您可能需要sqldf库。我们正在使用相同的聚合并以sql方式合并回实际的df。它更像是一种自我加入的东西。而且sql代码更容易理解

library (sqldf)
dfnew<-sqldf("select a.*,b.sum_quantity
             from df a left join 
             (select category, sum(quantity) sum_category
             from df group by 1) b
             on a.category=b.category")

dfnew

# category id quantity sum_category
#       AB  1      235          601
#       BC  2      987          987
#       AB  3      366          601
#       CD  4      287          287