lapply:查找总和或均值而不是计数

时间:2015-09-17 05:48:35

标签: r

假设我有一个看起来像这样的数据

    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类

此输出用于获利总和。

由于

1 个答案:

答案 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)