使用函数交叉制表数据

时间:2017-11-07 14:41:22

标签: r crosstab

我在树列中有数据

set.seed(42)
N = 1000
XYp = as.data.frame(matrix(cbind(round(runif(N)*100),
                                 round(runif(N)*1000+1000),
                                 round(runif(N),2)),N,3))
colnames(XYp) <- c('X','Y','p')

现在我想基于二维十进制对数据进行交叉制表:

colX_deciles = quantile(data[,'X'], probs=seq(0,1,1/10))
colY_deciles = quantile(data[,'Y'], probs=seq(0,1,1/10))
XYp['X_decile'] <- findInterval(XYp[,'X'],colX_deciles,all.inside = TRUE)
XYp['Y_decile'] <- findInterval(XYp[,'Y'],colY_deciles,all.inside = TRUE)
> colX_deciles
   0%   10%   20%   30%   40%   50%   60%   70%   80%   90%  100% 
  0.0   9.9  18.0  29.0  39.0  48.0  57.0  69.0  79.2  91.0 100.0 
> colY_deciles
    0%    10%    20%    30%    40%    50%    60%    70%    80%    90%   100% 
1000.0 1088.0 1180.0 1279.4 1392.0 1502.5 1602.4 1711.3 1805.2 1902.0 2000.0 

我已经发现可以使用p计算xtabs列中元素的总和:

> xtabs(p ~ X_decile + Y_decile, XYp)
        Y_decile
X_decile    1    2    3    4    5    6    7    8    9   10
      1  2.57 8.74 5.51 5.74 4.40 1.77 5.79 3.43 4.66 3.80
      2  6.43 4.25 7.29 5.41 3.08 4.43 8.70 2.62 3.37 4.45
      3  1.99 2.80 7.54 2.56 5.02 4.30 7.99 2.03 4.91 6.28
      4  4.53 4.90 8.04 3.49 2.25 2.87 7.47 5.41 3.54 9.28
      5  2.32 5.82 7.18 4.58 5.39 2.26 0.59 9.61 5.91 5.37
      6  7.70 5.50 6.45 7.83 4.65 8.45 1.70 6.40 4.88 4.32
      7  7.05 3.87 3.54 3.79 6.15 5.55 6.31 2.31 3.42 6.14
      8  4.43 4.50 3.04 3.62 9.92 5.66 3.75 7.01 4.92 7.08
      9  3.67 5.56 3.56 7.92 5.05 5.00 3.64 6.74 5.85 3.26
      10 5.75 3.17 9.50 5.44 3.64 6.13 3.18 5.93 6.18 3.71

但是如何优雅地将任何函数应用于交叉表格的矩阵元素并获得结果,例如avg(p)以下列方式? :

> xtabs(mean(p) ~ X_decile + Y_decile, XYp)
Error in model.frame.default(formula = mean(p) ~ X_decile + Y_decile,  : 
  variable lengths differ (found for 'X_decile')

作为奖励,colX_deciles[1:10]colY_deciles[1:10]的值可分别设置为行名和列名。

1 个答案:

答案 0 :(得分:2)

我假设你想一直使用XYp个对象(有时你使用data

我建议将aggregate函数浸入xtabs

xtabs(p ~ X_decile + Y_decile, aggregate(p ~ X_decile + Y_decile, XYp, mean))

    Y_decile
X_decile         1         2         3         4         5         6         7         8         9        10
  1  0.4283333 0.5826667 0.5009091 0.4100000 0.5500000 0.2950000 0.5263636 0.4900000 0.3584615 0.4222222
  2  0.5358333 0.5312500 0.6627273 0.4918182 0.3850000 0.5537500 0.5800000 0.4366667 0.4814286 0.4450000
  3  0.3980000 0.3500000 0.5800000 0.5120000 0.4183333 0.3583333 0.4205263 0.3383333 0.5455556 0.5233333
  4  0.4118182 0.3769231 0.6700000 0.5816667 0.5625000 0.3587500 0.6225000 0.3864286 0.5900000 0.7138462
  5  0.4640000 0.4476923 0.6527273 0.5088889 0.4900000 0.4520000 0.1966667 0.6006250 0.4925000 0.5370000
  6  0.4812500 0.6111111 0.7166667 0.5592857 0.5166667 0.6035714 0.3400000 0.5818182 0.5422222 0.6171429
  7  0.5035714 0.5528571 0.4425000 0.5414286 0.5125000 0.3964286 0.4853846 0.5775000 0.4275000 0.4723077
  8  0.4430000 0.4090909 0.6080000 0.5171429 0.6200000 0.5660000 0.4687500 0.5392308 0.3784615 0.5446154
  9  0.4077778 0.6177778 0.5085714 0.7200000 0.4208333 0.5000000 0.4550000 0.5616667 0.5318182 0.3622222
  10 0.5227273 0.4528571 0.6785714 0.3885714 0.3640000 0.4715385 0.5300000 0.5390909 0.6866667 0.5300000