我有一个data.frame包含三个二进制变量的调查数据。数据已经在列联表中,前3列是答案(1 =是,0 =否),第4列显示答案总数。行是三个不同的组。
我的目标是计算z分数,以检查比例是否与总数
相比有显着差异这是我的数据:
library(dplyr) #loading libraries
df <- structure(list(var1 = c(416, 1300, 479, 417),
var2 = c(265, 925,473, 279),
var3 = c(340, 1013, 344, 284),
totalN = c(1366, 4311,1904, 1233)),
class = "data.frame",
row.names = c(NA, -4L),
.Names = c("var1","var2", "var3", "totalN"))
这些是我的总价值
dfTotal <- df %>% summarise_all(funs(sum(., na.rm=TRUE)))
dfTotal
dfTotal <- data.frame(dfTotal)
rownames(dfTotal) <- "Total"
计算zScore我使用以下公式:
zScore <- function (cntA, totA, cntB, totB) {
#calculate
avgProportion <- (cntA + cntB) / (totA + totB)
probA <- cntA/totA
probB <- cntB/totB
SE <- sqrt(avgProportion * (1-avgProportion)*(1/totA + 1/totB))
zScore <- (probA-probB) / SE
return (zScore)
}
有没有办法使用dplyr计算一个4x3矩阵,该矩阵适用于所有四个组,变量var1到var3的z-test-value与总比例相对应?
我目前仍然坚持使用这段代码:
df %>% mutate_all(funs(zScore(., totalN,dftotal$var1,dfTotal$totalN)))
所以这里目前使用的参数如dftotal $ var1和dfTotal $ totalN不起作用,但我不知道如何将它们输入到公式中。对于第一个参数,它不能总是var1,但应该是var2,var3(和totalN)以匹配第一个参数。
答案 0 :(得分:2)
R中的z分数由scale
处理:
scale(df)
var1 var2 var3 totalN
[1,] -0.5481814 -0.71592544 -0.4483732 -0.5837722
[2,] 1.4965122 1.42698064 1.4952995 1.4690147
[3,] -0.4024623 -0.04058534 -0.4368209 -0.2087639
[4,] -0.5458684 -0.67046986 -0.6101053 -0.6764787
如果您只想要三个var列:
scale(df[,1:3])
var1 var2 var3
[1,] -0.5481814 -0.71592544 -0.4483732
[2,] 1.4965122 1.42698064 1.4952995
[3,] -0.4024623 -0.04058534 -0.4368209
[4,] -0.5458684 -0.67046986 -0.6101053
答案 1 :(得分:1)
如果您想在zScore
管道中使用dplyr
功能,我们需要先整理您的数据,然后添加包含您现在所拥有的值的新变量{{1} }:
dfTotal