R表函数:如何求和而不是计数?
假设我在R表中有如下数据:R表函数:如何求和而不是计数?,r,aggregate,R,Aggregate,假设我在R表中有如下数据: Id Name Price sales Profit Month Category Mode 1 A 2 5 8 1 X K 1 A 2 6 9 2 X K 1 A 2 5 8 3 X K 1 B 2 4 6 1 Y L 1
Id Name Price sales Profit Month Category Mode
1 A 2 5 8 1 X K
1 A 2 6 9 2 X K
1 A 2 5 8 3 X K
1 B 2 4 6 1 Y L
1 B 2 3 4 2 Y L
1 B 2 5 7 3 Y L
2 C 2 5 11 1 X M
2 C 2 5 11 2 X L
2 C 2 5 11 3 X K
2 D 2 8 10 1 Y M
2 D 2 8 10 2 Y K
2 D 2 5 7 3 Y K
3 E 2 5 9 1 Y M
3 E 2 5 9 2 Y L
3 E 2 5 9 3 Y M
3 F 2 4 7 1 Z M
3 F 2 5 8 2 Z L
3 F 2 5 8 3 Z M
如果我对该数据使用表
功能,如:
table(df$Category, df$Mode)
它将告诉我在每种模式下,哪个类别有多少个观测值。这就像计算每个模式下每个类别中的项目数
但是,如果我想让表格在每个类别下显示哪个模式
赚了多少利润
(总和或平均值),而不是总数,该怎么办
有没有办法用表
函数或R中的另一个函数来实现这一点?我们可以从基本R
使用xtabs
。默认情况下,xtabs
获取sum
xtabs(Profit~Category+Mode, df)
# Mode
#Category K L M
# X 36 11 11
# Y 17 26 28
# Z 0 8 15
或者另一个base R
选项是tapply
,它更灵活地应用不同的FUN
with(df, tapply(Profit, list(Category, Mode), FUN=sum))
# K L M
#X 36 11 11
#Y 17 26 28
#Z NA 8 15
或者我们可以使用dcast
将“长”格式转换为“宽”格式。它更灵活,因为我们可以指定fun.aggregate
到sum
,平均值
,中值
等
library(reshape2)
dcast(df, Category~Mode, value.var='Profit', sum)
# Category K L M
#1 X 36 11 11
#2 Y 17 26 28
#3 Z 0 8 15
如果您需要“长”格式,这里有一个带有data.table
的选项。我们将“data.frame”转换为“data.table”(setDT(df)
),按“Category”和“Mode”分组,得到“Profit”的和
library(data.table)
setDT(df)[, list(Profit= sum(Profit)) , by = .(Category, Mode)]
另一种可能是使用aggregate()
函数:
profit_dat <- aggregate(Profit ~ Category + Mode, data=df, sum)
#> profit_dat
# Category Mode Profit
#1 X K 36
#2 Y K 17
#3 X L 11
#4 Y L 26
#5 Z L 8
#6 X M 11
#7 Y M 28
#8 Z M 15
利润_dat利润_dat
#类别模式利润
#1 X K 36
#2 Y K 17
#3 X 11
#4 Y L 26
#5zl8
#6x11
#7 Y M 28
#8 Z M 15
对于大多数数据分析,我更喜欢使用dplyr(和ggplot2):
library(dplyr)
group_by(df, Category, Mode) %>%
summarise(sum = sum, count=n())
您可以这样求和和和计数:tmp=aggregate(df$Category,by=list(Category=df$Mode),FUN=sum)
或tmp=aggregate(df$Category,by=list(Category=df$Mode),FUN=NROW)
(注意“sum”是小写字母,“NROW”是大写字母)。