R表函数:如何求和而不是计数?

Jay*_*han 9 aggregate r

假设我在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
Run Code Online (Sandbox Code Playgroud)

如果我table在这个数据上使用函数,如:

table(df$Category, df$Mode)
Run Code Online (Sandbox Code Playgroud)

它会告诉我每种模式下哪个类别有多少观察.这就像计算每种模式下每个类别中的项目数量.

但在每个显示,如果我想在桌子上CategoryMode赚了多少Profit(和或均值),而不是总数?

有没有办法用tableR中的函数或其他函数做到这一点?

akr*_*run 14

我们可以使用xtabsbase R.默认情况下,xtabs获取sum

xtabs(Profit~Category+Mode, df)
#           Mode
#Category  K  L  M
#       X 36 11 11
#       Y 17 26 28
#       Z  0  8 15
Run Code Online (Sandbox Code Playgroud)

或者base R更灵活地应用不同的另一种选择FUNtapply.

with(df, tapply(Profit, list(Category, Mode), FUN=sum))
#  K  L  M
#X 36 11 11
#Y 17 26 28
#Z NA  8 15
Run Code Online (Sandbox Code Playgroud)

或者我们可以使用dcast从'long'格式转换为'wide'格式.它更加灵活,因为我们可以指定fun.aggregatesum,mean,median等.

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
Run Code Online (Sandbox Code Playgroud)

如果您需要"长"格式,这里有一个选项data.table.我们将'data.frame'转换为'data.table'(setDT(df)),按'Category'和'Mode'分组,得到sum'Profit'.

library(data.table)
setDT(df)[, list(Profit= sum(Profit)) , by = .(Category, Mode)]
Run Code Online (Sandbox Code Playgroud)