微信公众号搜"智元新知"关注
微信扫一扫可直接关注哦!

我如何使用 R 来获得一个类别与另一个类别的百分比?

如何解决我如何使用 R 来获得一个类别与另一个类别的百分比?

好的,所以我有一个表格,它的前几行看起来有点像这样:

部门 诊断代码
部门。 1 Code1
部门。 2 Code2
部门。 3 Code3
部门。 3 Code3
部门。 3 Code4
部门。 4 Code4
部门。 4 Code4
部门。 4 Code5
部门。 4 Code5
部门。 4 Code5

我想要的是开发一个看起来像这样的表格:

部门 代码1% Code2% 代码3% 代码4% 代码5%
部门。 1 xx% xx% xx% xx% xx%

其中上述百分比是每个部门的每个代码所占的百分比,即代码 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 以下是 dplyrtidyr 的解决方案。

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 举报,一经查实,本站将立刻删除。

相关推荐


Selenium Web驱动程序和Java。元素在(x,y)点处不可单击。其他元素将获得点击?
Python-如何使用点“。” 访问字典成员?
Java 字符串是不可变的。到底是什么意思?
Java中的“ final”关键字如何工作?(我仍然可以修改对象。)
“loop:”在Java代码中。这是什么,为什么要编译?
java.lang.ClassNotFoundException:sun.jdbc.odbc.JdbcOdbcDriver发生异常。为什么?
这是用Java进行XML解析的最佳库。
Java的PriorityQueue的内置迭代器不会以任何特定顺序遍历数据结构。为什么?
如何在Java中聆听按键时移动图像。
Java“Program to an interface”。这是什么意思?