计算变量的计数和百分比

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