在R

时间:2017-06-20 10:28:38

标签: r dplyr

我有一个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)以匹配第一个参数。

2 个答案:

答案 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