如何解决我如何使用 R 来获得一个类别与另一个类别的百分比?
部门 | 诊断代码 |
---|---|
部门。 1 | Code1 |
部门。 2 | Code2 |
部门。 3 | Code3 |
部门。 3 | Code3 |
部门。 3 | Code4 |
部门。 4 | Code4 |
部门。 4 | Code4 |
部门。 4 | Code5 |
部门。 4 | Code5 |
部门。 4 | Code5 |
我想要的是开发一个看起来像这样的表格:
其中上述百分比是每个部门的每个代码所占的百分比,即代码 1 在部门 1 中出现的总次数除以部门 1 中“代码实例”出现的总次数。所以如果代码 1在部门 1 中出现了 50 次,并且部门 1 在所有代码中记录了 120 个部门代码实例,百分比应该是 50/120。
我正在尝试使用 group_by()、mutate() 和 summarise() 的某种组合来完成工作,但我无法弄清楚如何正确组合和编写代码来获得我的输出想要。
当第二列是某种数字频率类型时,我已经看到很多示例代码显示类似的东西,但是当第二列由对应于离散类别的字符串组成时,我还没有找到类似的东西。
>**编辑:此外,代码是字母数字。例如,一个代码可能是 E77.09,而另一个可能是 C30,另一个可能是 D24.3
解决方法
df<- data.frame(
stringsAsFactors = FALSE,Department = c("Dept. 1","Dept. 2","Dept. 3","Dept. 4","Dept. 4"),Diagnosis.Code = c("Code1","Code2","Code3","Code4","Code5","Code5")
)
library(dplyr,warn.conflicts = FALSE)
library(janitor)
df %>% tabyl(Department,Diagnosis.Code) %>%
adorn_percentages() %>%
adorn_pct_formatting(2)
#> Department Code1 Code2 Code3 Code4 Code5
#> Dept. 1 100.00% 0.00% 0.00% 0.00% 0.00%
#> Dept. 2 0.00% 100.00% 0.00% 0.00% 0.00%
#> Dept. 3 0.00% 0.00% 66.67% 33.33% 0.00%
#> Dept. 4 0.00% 0.00% 0.00% 40.00% 60.00%
由 reprex package (v2.0.0) 于 2021 年 7 月 21 日创建
,如果您想要一个简单的基本 R 解决方案:
tab = table(dat[,1],dat[,2])
tab / rowSums(tab) * 100
Code1 Code2 Code3 Code4 Code5
Dept. 1 100.00000 0.00000 0.00000 0.00000 0.00000
Dept. 2 0.00000 100.00000 0.00000 0.00000 0.00000
Dept. 3 0.00000 0.00000 66.66667 33.33333 0.00000
Dept. 4 0.00000 0.00000 0.00000 40.00000 60.00000
,
1 最简单的方法是基 R。
tbl <- table(df1[[1]],df1[[2]])
100*tbl/rowSums(tbl)
# Code1 Code2 Code3 Code4 Code5
# Dept. 1 100.00000 0.00000 0.00000 0.00000 0.00000
# Dept. 2 0.00000 100.00000 0.00000 0.00000 0.00000
# Dept. 3 0.00000 0.00000 66.66667 33.33333 0.00000
# Dept. 4 0.00000 0.00000 0.00000 40.00000 60.00000
还有一个。
xtb <- xtabs(~ Department + Code,df1)
100*xtb/rowSums(xtb)
2 以下是 dplyr
和 tidyr
的解决方案。
library(dplyr)
library(tidyr)
df1 %>%
group_by(Department) %>%
mutate(d = n()) %>%
group_by(Department,Code) %>%
summarise(Perc = n()/first(d),.groups = "drop") %>%
pivot_wider(
id_cols = Department,names_from = Code,values_from = Perc
)
## A tibble: 4 x 6
# Department Code1 Code2 Code3 Code4 Code5
# <chr> <dbl> <dbl> <dbl> <dbl> <dbl>
#1 Dept. 1 1 NA NA NA NA
#2 Dept. 2 NA 1 NA NA NA
#3 Dept. 3 NA NA 0.667 0.333 NA
#4 Dept. 4 NA NA NA 0.4 0.6
要在有 NA
的地方使用带有零的百分比值,只需进行简单的更改即可。
df1 %>%
group_by(Department) %>%
mutate(d = n()) %>%
group_by(Department,Code) %>%
summarise(Perc = 100 * n()/first(d),values_from = Perc,values_fill = 0
)
数据
df1 <-
structure(list(Department = c("Dept. 1",Code = c("Code1","Code5")),row.names = c(NA,-10L),class = "data.frame")
版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。