计算变量的计数和百分比
calculating counts and percentages of a variable
我正在尝试创建观察次数的计数并从这些计数中提取百分比。
我有这样的数据:
UserID substance_use
43124 0
43124 1
43124 0
43124 0
43124 1
215 1
215 1
我想要这样的物质使用观察总数:
UserID substance_use count
43124 0 5
43124 1 5
43124 0 5
43124 0 5
43124 1 5
215 1 2
215 1 2
然后,我想要参与者说“是”和“否”的访问百分比,如下所示:
UserID substance_use count percent_yes percent_no
43124 0 5 40% 60%
43124 1 5 40% 60%
43124 0 5 40% 60%
43124 0 5 40% 60%
43124 1 5 40% 0%
215 1 2 100% 0
215 1 2 100% 0%
我尝试在第一部分使用计数函数,但它没有考虑 0。任何帮助将不胜感激。
我们可以使用add_count
创建'count'列,然后将二进制列的mean
分组到return和percent_yes
和从 percent_yes 减去 100 到 return percent_no
library(dplyr)
df1 %>%
add_count(UserID, name = 'count') %>%
group_by(UserID) %>%
mutate(percent_yes = 100 * mean(substance_use),
percent_no = 100 - percent_yes) %>%
ungroup
-输出
# A tibble: 7 × 5
UserID substance_use count percent_yes percent_no
<int> <int> <int> <dbl> <dbl>
1 43124 0 5 40 60
2 43124 1 5 40 60
3 43124 0 5 40 60
4 43124 0 5 40 60
5 43124 1 5 40 60
6 215 1 2 100 0
7 215 1 2 100 0
注意:这里,我们假设 'substance_use' 列
中没有缺失值
数据
df1 <- structure(list(UserID = c(43124L, 43124L, 43124L, 43124L, 43124L,
215L, 215L), substance_use = c(0L, 1L, 0L, 0L, 1L, 1L, 1L)),
class = "data.frame", row.names = c(NA,
-7L))
不确定您是否需要每一行中的汇总 (!) 信息,或者更确切地说是希望按 ID 汇总,在这种情况下,您可以执行以下操作:
(使用与 akrun 的回答中提供的相同的 df1 数据)
library(tidyverse)
library(scales)
df1 %>%
group_by(UserID) %>%
summarize(count = n(),
percent_yes = percent(sum(substance_use == 1)/count),
percent_no = percent(sum(substance_use == 0)/count))
给出:
# A tibble: 2 x 4
UserID count percent_yes percent_no
<int> <int> <chr> <chr>
1 215 2 100% 0%
2 43124 5 40% 60%
另一个可能的解决方案:
library(tidyverse)
df <- structure(list(UserID = c(43124, 43124, 43124, 43124, 43124,
215, 215), substance_use = c(0, 1, 0, 0, 1, 1, 1)), row.names = c(NA,
-7L), class = "data.frame")
df %>%
mutate(count = ave(UserID, UserID, FUN = length),
percent_yes = ave(substance_use, UserID, FUN = \(x) 100*sum(x)/length(x)),
percent_no = 100 - percent_yes)
#> UserID substance_use count percent_yes percent_no
#> 1 43124 0 5 40 60
#> 2 43124 1 5 40 60
#> 3 43124 0 5 40 60
#> 4 43124 0 5 40 60
#> 5 43124 1 5 40 60
#> 6 215 1 2 100 0
#> 7 215 1 2 100 0
我正在尝试创建观察次数的计数并从这些计数中提取百分比。
我有这样的数据:
UserID substance_use
43124 0
43124 1
43124 0
43124 0
43124 1
215 1
215 1
我想要这样的物质使用观察总数:
UserID substance_use count
43124 0 5
43124 1 5
43124 0 5
43124 0 5
43124 1 5
215 1 2
215 1 2
然后,我想要参与者说“是”和“否”的访问百分比,如下所示:
UserID substance_use count percent_yes percent_no
43124 0 5 40% 60%
43124 1 5 40% 60%
43124 0 5 40% 60%
43124 0 5 40% 60%
43124 1 5 40% 0%
215 1 2 100% 0
215 1 2 100% 0%
我尝试在第一部分使用计数函数,但它没有考虑 0。任何帮助将不胜感激。
我们可以使用add_count
创建'count'列,然后将二进制列的mean
分组到return和percent_yes
和从 percent_yes 减去 100 到 return percent_no
library(dplyr)
df1 %>%
add_count(UserID, name = 'count') %>%
group_by(UserID) %>%
mutate(percent_yes = 100 * mean(substance_use),
percent_no = 100 - percent_yes) %>%
ungroup
-输出
# A tibble: 7 × 5
UserID substance_use count percent_yes percent_no
<int> <int> <int> <dbl> <dbl>
1 43124 0 5 40 60
2 43124 1 5 40 60
3 43124 0 5 40 60
4 43124 0 5 40 60
5 43124 1 5 40 60
6 215 1 2 100 0
7 215 1 2 100 0
注意:这里,我们假设 'substance_use' 列
中没有缺失值数据
df1 <- structure(list(UserID = c(43124L, 43124L, 43124L, 43124L, 43124L,
215L, 215L), substance_use = c(0L, 1L, 0L, 0L, 1L, 1L, 1L)),
class = "data.frame", row.names = c(NA,
-7L))
不确定您是否需要每一行中的汇总 (!) 信息,或者更确切地说是希望按 ID 汇总,在这种情况下,您可以执行以下操作: (使用与 akrun 的回答中提供的相同的 df1 数据)
library(tidyverse)
library(scales)
df1 %>%
group_by(UserID) %>%
summarize(count = n(),
percent_yes = percent(sum(substance_use == 1)/count),
percent_no = percent(sum(substance_use == 0)/count))
给出:
# A tibble: 2 x 4
UserID count percent_yes percent_no
<int> <int> <chr> <chr>
1 215 2 100% 0%
2 43124 5 40% 60%
另一个可能的解决方案:
library(tidyverse)
df <- structure(list(UserID = c(43124, 43124, 43124, 43124, 43124,
215, 215), substance_use = c(0, 1, 0, 0, 1, 1, 1)), row.names = c(NA,
-7L), class = "data.frame")
df %>%
mutate(count = ave(UserID, UserID, FUN = length),
percent_yes = ave(substance_use, UserID, FUN = \(x) 100*sum(x)/length(x)),
percent_no = 100 - percent_yes)
#> UserID substance_use count percent_yes percent_no
#> 1 43124 0 5 40 60
#> 2 43124 1 5 40 60
#> 3 43124 0 5 40 60
#> 4 43124 0 5 40 60
#> 5 43124 1 5 40 60
#> 6 215 1 2 100 0
#> 7 215 1 2 100 0