R dplyr计算组和列的百分比

  • 本文关键字:百分比 dplyr 计算 r dplyr
  • 更新时间 :
  • 英文 :


我是R的新手,有一个简单的"如何"问题,特别是计算数据帧列的组百分比和总体百分比的最佳方法是什么?我的数据如下:

# A tibble: 13 x 3
group  resp id   
<chr> <dbl> <chr>
1 A         1 ssa  
2 A         1 das  
3 A        NA fdsf 
4 B        NA gfd  
5 B         1 dfg  
6 B         1 dg   
7 C         1 gdf  
8 C        NA gdf  
9 C        NA hfg  
10 D         1 hfg  
11 D         1 trw  
12 D         1 jyt  
13 D        NA ghj

测试数据是这样的:

structure(list(group = c("A", "A", "A", "B", "B", "B", "C", "C", 
"C", "D", "D", "D", "D"), resp = c(1, 1, NA, NA, 1, 1, 1, NA, 
NA, 1, 1, 1, NA), id = c("ssa", "das", "fdsf", "gfd", "dfg", 
"dg", "gdf", "gdf", "hfg", "hfg", "trw", "jyt", "ghj")), class = c("spec_tbl_df", 
"tbl_df", "tbl", "data.frame")

我通过做以下事情(这似乎过于复杂(来完成小组百分比:

a <- test %>% 
group_by(group) %>% 
summarise(no_resp = sum(resp, na.rm = TRUE))
b <- test %>%  
group_by(group) %>% 
summarise(all = n_distinct(id, na.rm = TRUE))
result <- a %>% 
left_join(b) %>% 
mutate(a,resp_rate = round(no_resp/all*100))

这给了我:

# A tibble: 4 x 4
group no_resp   all resp_rate
<chr>   <dbl> <int>     <dbl>
1 A           2     3        67
2 B           2     3        67
3 C           1     2        50
4 D           3     4        75

这很好,但我想知道如何才能让它变得更简单?此外,我将如何计算总体百分比?例如,不分组的resp/id的整体不同计数。

非常感谢

您可以在summarise中添加多个语句,这样就不必创建临时对象ab。要计算总百分比,可以将数字除以列的总和。

library(dplyr)
test %>%
group_by(group) %>%
summarise(no_resp = sum(resp, na.rm = TRUE), 
all = n_distinct(id), 
resp_rate = round(no_resp/all*100)) %>%
mutate(no_resp_perc = no_resp/sum(no_resp) * 100)
#  group no_resp   all resp_rate no_resp_perc
#  <chr>   <int> <int>     <dbl>        <dbl>
#1 A           2     3        67         25  
#2 B           2     3        67         25  
#3 C           1     2        50         12.5
#4 D           3     4        75         37.5

使用基R,我们可以应用tapplytable函数。

res <- transform(with(test, data.frame(no_resp=tapply(resp, group, sum, na.rm=TRUE),
all=colSums(table(id, group) > 0))), 
resp_rate=round(no_resp/all*100),
overall_perc=prop.table(no_resp)*100
)
res
#   no_resp all resp_rate overall_perc
# A       2   3        67         25.0
# B       2   3        67         25.0
# C       1   2        50         12.5
# D       3   4        75         37.5

最新更新