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

假设我在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   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”是大写字母)。