Как сделать перекрестную таблицу с двумя категориальными переменными, но заполнить ее средним значением третьей переменной
library(ggplot2)
data(diamonds)
str(diamonds)
## 'data.frame': 53940 obs. of 10 variables:
## $ carat : num 0.23 0.21 0.23 0.29 0.31 0.24 0.24 0.26 0.22 0.23 ...
## $ cut : Ord.factor w/ 5 levels "Fair"<"Good"<..: 5 4 2 4 2 3 3 3 1 3 ...
## $ color : Ord.factor w/ 7 levels "D"<"E"<"F"<"G"<..: 2 2 2 6 7 7 6 5 2 5 ...
## $ clarity: Ord.factor w/ 8 levels "I1"<"SI2"<"SI1"<..: 2 3 5 4 2 6 7 3 4 5 ...
## $ depth : num 61.5 59.8 56.9 62.4 63.3 62.8 62.3 61.9 65.1 59.4 ...
## $ table : num 55 61 65 58 58 57 57 55 61 61 ...
## $ price : int 326 326 327 334 335 336 336 337 337 338 ...
## $ x : num 3.95 3.89 4.05 4.2 4.34 3.94 3.95 4.07 3.87 4 ...
## $ y : num 3.98 3.84 4.07 4.23 4.35 3.96 3.98 4.11 3.78 4.05 ...
## $ z : num 2.43 2.31 2.31 2.63 2.75 2.48 2.47 2.53 2.49 2.39 ...
Это мой кросс -
table(diamonds$cut,diamonds$color)
##
## D E F G H I J
## Fair 163 224 312 314 303 175 119
## Good 662 933 909 871 702 522 307
## Very Good 1513 2400 2164 2299 1824 1204 678
## Premium 1603 2337 2331 2924 2360 1428 808
## Ideal 2834 3903 3826 4884 3115 2093 896
но вместо того, чтобы получать подсчеты, я хочу среднюю цену(или среднее значение(цена) или даже Макс (цена)
я попробовал пакет Hmisc, но он дает мне данные в более длинном формате, который мне нужен в формате таблицы выше
summarize(diamonds$price,llist(diamonds$color,diamonds$clarity),max)
## diamonds$color diamonds$clarity diamonds$price
## 1 D I1 15964
## 4 D SI2 18693
## 3 D SI1 18468
## 6 D VS2 18318
## 5 D VS1 17936
## 8 D VVS2 17545
## 7 D VVS1 17932
## 2 D IF 18542
## 9 E I1 11548
## 12 E SI2 18477
## 11 E SI1 18731
## 14 E VS2 18557
## 13 E VS1 18729
## 16 E VVS2 18188
## 15 E VVS1 16256
## 10 E IF 18700
## 17 F I1 10685
## 20 F SI2 18784
## 19 F SI1 18759
## 22 F VS2 18791
## 21 F VS1 18780
## 24 F VVS2 18614
## 23 F VVS1 18777
## 18 F IF 18552
## 25 G I1 13203
## 28 G SI2 18804
## 27 G SI1 18818
## 30 G VS2 18700
## 29 G VS1 18419
## 32 G VVS2 18768
## 31 G VVS1 18445
## 26 G IF 18806
## 33 H I1 17329
## 36 H SI2 18745
## 35 H SI1 18803
## 38 H VS2 18659
## 37 H VS1 18522
## 40 H VVS2 17267
## 39 H VVS1 14603
## 34 H IF 16300
## 41 I I1 16193
## 44 I SI2 18756
## 43 I SI1 18797
## 46 I VS2 18823
## 45 I VS1 18795
## 48 I VVS2 15952
## 47 I VVS1 15654
## 42 I IF 12725
## 49 J I1 18531
## 52 J SI2 18710
## 51 J SI1 18508
## 54 J VS2 18701
## 53 J VS1 18706
## 56 J VVS2 17214
## 55 J VVS1 17891
## 50 J IF 18594
3 ответов
попробовать
library(reshape2)
acast(diamonds, cut~color, value.var='price', mean)
# D E F G H I J
#Fair 4291.061 3682.312 3827.003 4239.255 5135.683 4685.446 4975.655
#Good 3405.382 3423.644 3495.750 4123.482 4276.255 5078.533 4574.173
#Very Good 3470.467 3214.652 3778.820 3872.754 4535.390 5255.880 5103.513
#Premium 3631.293 3538.914 4324.890 4500.742 5216.707 5946.181 6294.592
#Ideal 2629.095 2597.550 3374.939 3720.706 3889.335 4451.970 4918.186
или через base R
with(diamonds, tapply(price, list(cut,color), FUN= mean))
# D E F G H I J
#Fair 4291.061 3682.312 3827.003 4239.255 5135.683 4685.446 4975.655
#Good 3405.382 3423.644 3495.750 4123.482 4276.255 5078.533 4574.173
#Very Good 3470.467 3214.652 3778.820 3872.754 4535.390 5255.880 5103.513
#Premium 3631.293 3538.914 4324.890 4500.742 5216.707 5946.181 6294.592
#Ideal 2629.095 2597.550 3374.939 3720.706 3889.335 4451.970 4918.186
или как предложил @ DavidArenburg
xtabs(price ~ cut + color, diamonds)/table(diamonds[c('cut', 'color')])
# color
#cut D E F G H I J
#Fair 4291.061 3682.312 3827.003 4239.255 5135.683 4685.446 4975.655
#Good 3405.382 3423.644 3495.750 4123.482 4276.255 5078.533 4574.173
#Very Good 3470.467 3214.652 3778.820 3872.754 4535.390 5255.880 5103.513
#Premium 3631.293 3538.914 4324.890 4500.742 5216.707 5946.181 6294.592
#Ideal 2629.095 2597.550 3374.939 3720.706 3889.335 4451.970 4918.186
вы также можете попробовать dcast
из версии devel data.table
т. е. v1.9.5.
library(data.table)
dcast(as.data.table(diamonds), cut~color, value.var='price', mean)
если переменные группировки 'ясность' и 'цвет'
with(diamonds, tapply(price, list(clarity,color), FUN = mean))
для других функций, изменить FUN
на tapply
или fun.aggregate
на acast/dcast
попробуй:
library(dplyr)
library(tidyr)
diamonds %>%
group_by(cut, color) %>%
summarise(price = mean(price)) %>%
spread(color, price)
что дает:
#Source: local data frame [5 x 8]
#
# cut D E F G H I J
#1 Fair 4291.061 3682.312 3827.003 4239.255 5135.683 4685.446 4975.655
#2 Good 3405.382 3423.644 3495.750 4123.482 4276.255 5078.533 4574.173
#3 Very Good 3470.467 3214.652 3778.820 3872.754 4535.390 5255.880 5103.513
#4 Premium 3631.293 3538.914 4324.890 4500.742 5216.707 5946.181 6294.592
#5 Ideal 2629.095 2597.550 3374.939 3720.706 3889.335 4451.970 4918.186
другая альтернатива
library(plyr)
library(tidyr)
spread(ddply(diamonds, .(cut, color), summarize, new = mean(price)), color, new)
# cut D E F G H I J
#1 Fair 4291.061 3682.312 3827.003 4239.255 5135.683 4685.446 4975.655
#2 Good 3405.382 3423.644 3495.750 4123.482 4276.255 5078.533 4574.173
#3 Very Good 3470.467 3214.652 3778.820 3872.754 4535.390 5255.880 5103.513
#4 Premium 3631.293 3538.914 4324.890 4500.742 5216.707 5946.181 6294.592
#5 Ideal 2629.095 2597.550 3374.939 3720.706 3889.335 4451.970 4918.186