使用dplyr计算分组变量的数量

时间:2015-02-09 10:23:32

标签: r count dplyr

我想创建一个数据框,其中包含比例的置信区间作为最终结果。我已经引入了一个变量(在我的例子中为tp)作为截止值来计算比例。我想使用dplyr包来生成最终的数据帧。 以下是一个简化示例:

library(dplyr)

my_names <- c("A","B")
dt <- data.frame(
  Z = sample(my_names,100,replace = TRUE),
  X = sample(1:10, replace = TRUE),
  Y = sample(c(0,1), 100, replace = TRUE)
)  
  my.df <- dt%>%  
    mutate(tp = (X >8)* 1) %>% #multiply by one to convert into numeric
    group_by(Z, tp) %>%
    summarise(n = n()) %>%
    mutate(prop.tp= n/sum(n)) %>%
    mutate(SE.tp = sqrt((prop.tp*(1-prop.tp))/n))%>%
    mutate(Lower_limit = prop.tp-1.96 * SE.tp)%>%
    mutate(Upper_limit = prop.tp+1.96 * SE.tp)

output:

Source: local data frame [4 x 7]
Groups: Z

  Z tp  n   prop.tp      SE.tp Lower_limit Upper_limit
1 A  0 33 0.6346154 0.08382498   0.4703184   0.7989123
2 A  1 19 0.3653846 0.11047236   0.1488588   0.5819104
3 B  0 27 0.5625000 0.09547033   0.3753782   0.7496218
4 B  1 21 0.4375000 0.10825318   0.2253238   0.6496762

但是,我想使用Z列中组的总样本计算标准误差和CI:s,而不是按分类变量tp分割样本。 所以我的例子中A的总样本应该是n = 33 +19。 有什么想法吗?

1 个答案:

答案 0 :(得分:1)

不太确定我想要与哪个组进行比较,但无论如何,您有两个分组变量tp = X > 8Z。 如果您想将X > 8Z == "A"的行与X > 8的所有行进行比较,您可以这样做

merge(
    dt %>%
        group_by(X > 8) %>%
        summarize(n.X = n()),
    dt %>%
        group_by(X > 8, Z) %>%
        summarise(n.XZ = n()),
    by = "X > 8"
) %>%
    mutate(prop.XZ = n.XZ/n.X) %>%
    mutate(SE = sqrt((prop.XZ*(1-prop.XZ))/n.X))%>%
    mutate(Lower_limit = prop.XZ-1.96 * SE) %>%
    mutate(Upper_limit = prop.XZ+1.96 * SE)
  X > 8 n.X Z n.XZ   prop.XZ         SE Lower_limit Upper_limit
1 FALSE  70 A   37 0.5285714 0.05966378   0.4116304   0.6455124
2 FALSE  70 B   33 0.4714286 0.05966378   0.3544876   0.5883696
3  TRUE  30 A   16 0.5333333 0.09108401   0.3548087   0.7118580
4  TRUE  30 B   14 0.4666667 0.09108401   0.2881420   0.6451913

如果您想解决问题并将X > 8Z == "A"Z == "A"的所有行进行比较,您可以这样做

merge(
    dt %>%
        group_by(Z) %>%
        summarize(n.Z = n()),
    dt %>%
        group_by(X > 8, Z) %>%
        summarise(n.XZ = n()),
    by = "Z"
) %>%
    mutate(prop.XZ = n.XZ/n.Z) %>%
    mutate(SE = sqrt((prop.XZ*(1-prop.XZ))/n.Z))%>%
    mutate(Lower_limit = prop.XZ-1.96 * SE) %>%
    mutate(Upper_limit = prop.XZ+1.96 * SE)
  Z n.Z X > 8 n.XZ   prop.XZ         SE Lower_limit Upper_limit
1 A  53 FALSE   37 0.6981132 0.06305900   0.5745176   0.8217088
2 A  53  TRUE   16 0.3018868 0.06305900   0.1782912   0.4254824
3 B  47 FALSE   33 0.7021277 0.06670743   0.5713811   0.8328742
4 B  47  TRUE   14 0.2978723 0.06670743   0.1671258   0.4286189

对于merge两个单独的分组来说有点混乱,但我不知道是否可以在同一个语句中取消组合和重组。虽然在两个不同的级别上使用分组是多么困难(如果你可以称之为),并且希望其他人能够提出更好的解决方案,我感到很惊讶。