使用 dplyr 的分组变量计数
counts of grouped variables using 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。
有什么想法吗?
不太确定我在这里得到您想与哪个组进行比较,但无论如何您有两个分组变量 tp = X > 8
和 Z
。
如果您想将 X > 8
和 Z == "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 > 8
和 Z == "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
两个单独的分组有点麻烦,但我不知道是否可以在同一语句中取消分组和重新分组。尽管在两个不同级别上使用分组(如果可以这样称呼的话)似乎有多么困难,但我感到很惊讶,希望其他人能提出更好的解决方案。
我想创建一个包含比例置信区间的数据框作为最终结果。我引入了一个变量(在我的示例中为 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。 有什么想法吗?
不太确定我在这里得到您想与哪个组进行比较,但无论如何您有两个分组变量 tp = X > 8
和 Z
。
如果您想将 X > 8
和 Z == "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 > 8
和 Z == "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
两个单独的分组有点麻烦,但我不知道是否可以在同一语句中取消分组和重新分组。尽管在两个不同级别上使用分组(如果可以这样称呼的话)似乎有多么困难,但我感到很惊讶,希望其他人能提出更好的解决方案。