2015-09-17 5 views
0

Предположим, у меня есть данные, которая выглядит следующим образомlapply: Нахождение суммы или среднее вместо подсчета

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

Эта команда работает, чтобы найти номер поставщика под каждого режима для каждой категории, но как изменить его так, он может дать общее и среднее Profit сделал.

Edit 1: Ожидаемые результаты

Категория X

 Mode 
Supplier  K  L  M 
    John  36  11  11 
    Sam  0  17  0 
    Kyle  0  0  0  

Категория Y

 Mode 
Supplier  K  L  M 
    John  17  0  10 
    Sam  0  9  18 
    Kyle  0  0  0 

Категория Z

Этот выход для суммы прибыли.

Благодаря

+0

@akrun сделал это сумма прибыли. –

ответ

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) 
+0

Но он объединит прибыль всех категорий для поставок, как получить отдельную таблицу для каждой категории (X, Y, Z), которая показывает среднее значение или сумму прибыли для каждого поставщика в каждом режиме? –

+0

Я написал ожидаемый результат для суммы прибыли. Может быть, мне нужен выход, который пропускает строки, которые имеют только 0, например, 3-я строка для категории X и Y. –

Смежные вопросы