假设我有一个看起来像这样的数据
Id Name Price sales Profit Month Category Mode Supplier
1 1 A 2 5 8 1 X K John
2 1 A 2 6 9 2 X K John
3 1 A 2 5 8 3 X K John
4 2 B 2 4 6 1 X L Sam
5 2 B 2 3 4 2 X L Sam
6 2 B 2 5 7 3 X L Sam
7 3 C 2 5 11 1 X M John
8 3 C 2 5 11 2 X L John
9 3 C 2 5 11 3 X K John
10 4 D 2 8 10 1 Y M John
11 4 D 2 8 10 2 Y K John
12 4 D 2 5 7 3 Y K John
13 5 E 2 5 9 1 Y M Sam
14 5 E 2 5 9 2 Y L Sam
15 5 E 2 5 9 3 Y M Sam
16 6 F 2 4 7 1 Z M Kyle
17 6 F 2 5 8 2 Z L Kyle
18 6 F 2 5 8 3 Z M Kyle
我有兴趣在每个category
(X,Y,Z)下找出哪supplier
Mode
使用哪Profit
并且多少lapply(split(df, df$Category), function(x) table(as.character(x$Supplier), x$Mode))
(可以是总和或平均值)。
Mode
Supplier K L M
John 36 11 11
Sam 0 17 0
Kyle 0 0 0
此命令用于查找每个类别下每个类别的供应商数量,但如何修改它以便它可以提供总利润和平均利润。
编辑1:预期输出
X类
Mode
Supplier K L M
John 17 0 10
Sam 0 9 18
Kyle 0 0 0
Y类
// Enabling multidex support.
multiDexEnabled true
Z类
此输出用于获利总和。
由于
答案 0 :(得分:1)
对于带总和的简单交叉制表,您可以使用xtabs()
。通过三个类别,我们可以获得三维数组。
( xt <- xtabs(Profit ~ Supplier + Mode + Category, df) )
# , , Category = X
#
# Mode
# Supplier K L M
# John 36 11 11
# Kyle 0 0 0
# Sam 0 17 0
#
# , , Category = Y
#
# Mode
# Supplier K L M
# John 17 0 10
# Kyle 0 0 0
# Sam 0 9 18
#
# , , Category = Z
#
# Mode
# Supplier K L M
# John 0 0 0
# Kyle 0 8 15
# Sam 0 0 0
要查看此数组没有全部为零的行,我们可以执行
apply(xt, 3, function(x) x[rowSums(x) != 0, , drop = FALSE])
对于均值(或总和,或任何其他函数),tapply()
也将返回一个数组。
with(df, tapply(Profit, list(Supplier, Mode, Category), mean))
您也可以使用aggregate()
aggregate(Profit ~ Category + Mode + Supplier, df, mean)