假设我在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)
它会告诉我每种模式下哪个类别有多少观察.这就像计算每种模式下每个类别中的项目数量.
但在每个显示,如果我想在桌子上Category
它Mode
赚了多少Profit
(和或均值),而不是总数?
有没有办法用table
R中的函数或其他函数做到这一点?
akr*_*run 14
我们可以使用xtabs
从base 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
更灵活地应用不同的另一种选择FUN
是tapply
.
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.aggregate
到sum
,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)