我有一个数据帧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"
它有效,但我觉得它不太令人满意,可能还有更好的方法吗?
答案 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