【发布时间】:2021-07-22 00:36:44
【问题描述】:
我想通过在 R 中使用 apply() 计算三维数组中单元格之间的百分比差异来研究一个幼稚的假设。但是,没有得到正确的解决方案。
下面是我想应用于“数据集”包中以下 HairEyeColor 数据集中每个单元格的百分比差异。
百分比差异的一般表达式是这样的。
100%*(1-Female/Male)
图书馆
library(vcd)
library(DescTools)
data("HairEyeColor",package="datasets") # load data
str(HairEyeColor) #show structure
a <- HairEyeColor[,,1] # male table
b <- HairEyeColor[,,2] # female table
将数组绑定在一起,1 表示男性,2 表示女性。
HEC1=Abind(Male=a, Female=b, along=3)
输出
, , Male
Brown Blue Hazel Green
Black 32 11 10 3
Brown 53 50 25 15
Red 10 10 7 7
Blond 3 30 5 8
, , Female
Brown Blue Hazel Green
Black 36 9 5 2
Brown 66 34 29 14
Red 16 7 7 7
Blond 4 64 5 8
贡献者的注释:prop.table() 命令产生百分比,使用总案例作为 100% 计算。对于条件相对频率,请使用边距参数。 然后使用 apply() 允许我们沿数组(或矩阵)中的任何维度或维度组合执行任何计算。
apply(prop.table(HEC1), c(1,2), diff)
这里是输出,但这不是最近的区别。
Brown Blue Hazel Green
Black 0.006756757 -0.003378378 -0.008445946 -0.001689189
Brown 0.021959459 -0.027027027 0.006756757 -0.001689189
Red 0.010135135 -0.005067568 0.000000000 0.000000000
Blond 0.001689189 0.057432432 0.000000000 0.000000000
我也试过了,没有成功。
apply(prop.table(HEC1), c(1,1,2), diff)
这是人们对男性与女性黑色和棕色之间百分比差异的预期。会是
(HEC1[1,1,1] - HEC1[1,1,2])*100/HEC1[1,1,1]
输出
-12.5
想要的表
Brown Blue Hazel Green
Black -12.5 18.1 50 33.3
Brown -24.5 32 -16 6.6
Red -60 3 0 0
Blond -33.3 -113.3 0 0
任何建议都是有帮助的。谢谢
我研究了这个问题,但是它指的是长格式的时间序列How to calculate percent differences in a table in R
【问题讨论】:
-
一个问题是
prop.table计算的是比例而不是百分比,因此您需要将每个表乘以 100。 -
@dcarlson -12.5 不等于 0.675 %,因为黑人和棕色人的分母是男性。?
-
@dcarlson 感谢您的贡献。以下提供了所需的表格,但是,是否有更快的解决方案? >ab 100*(1-b/a)
-
这是女性与男性的比例增加/减少,而不是男性与女性的比例/百分比差异。由于样本中女性超过男性,因此比例增加/减少的预期值为
100 *(1 - 313/279) = -12.18638。我的解决方案提供了男性和女性之间头发颜色/眼睛颜色组合百分比的差异。 -
@dcarlson 谢谢您的回复。你的过程和使用 Delt(,type='arithmetic')*100 一样吗?