R:如何将每个单元格值(数据帧)除以包含相应行和列总计的数量

R: how to divide each cell value (dataframe) by a quantity that includes the correspoding row AND column total

我有一个交叉表(数据帧格式),我从中计算了卡方标准化残差。下面我提供了两个可重现的数据集。

交叉表:

df <- structure(c(310, 36, 0, 0, 212, 158, 9, 0, 21, 35, 17, 4, 25, 
102, 49, 18, 7, 35, 51, 28), .Dim = 4:5, .Dimnames = list(c("none", 
"grade1", "grade2", "grade3"), c("0-9", "10-19", "20-29", "30-39", 
"40+")))

标准化残差

st.residuals <- structure(c(9.882, -7.267, -6.247, -3.935, 1.21, 3.035, -5.162, 
-4.119, -2.96, 1.945, 2.821, 0.298, -7.492, 4.82, 5.796, 3.161, 
-7.005, -0.738, 10.11, 9.704), .Dim = 4:5, .Dimnames = list(c("none", 
"grade1", "grade2", "grade3"), c("0-9", "10-19", "20-29", "30-39", 
"40+")))

目标

我要做的是计算调整后的标准化残差,这需要将每个标准化残差除以下图中指示的数量,其中 GT 是 table 总计,CT 是列总计, RC 是行总数:

我卡在哪里

我很难弄清楚(我的问题)如何在 R 中实现分母的计算。特别是,我不知道如何编码,以便对于每个单元格 R 都会考虑相应的行和列总计。

1) R 已经在 chisq.test:

chisq.test(df)$stdres

2) 或以下。 residuals 与问题中的 st.residuals 相同,最后一行产生与上面一行相同的结果。

expected <- outer(rowSums(df), colSums(df)) / sum(df)
residuals <- (df - expected) / sqrt(expected)
residuals / sqrt(outer((1 - rowSums(df) / sum(df)), (1 - colSums(df) / sum(df))))

3) 或者我们可以使用扫描来计算上面的 (1)。残差来自(2),并且如前所述,等于问题中的st.residuals。

residuals |>
  sweep(1, sqrt(1 - rowSums(df) / sum(df)), `/`) |>
  sweep(2, sqrt(1 - colSums(df) / sum(df)), `/`)