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

如何获得R中频率表的中位数?

如何解决如何获得R中频率表的中位数?

问题

我改变了我的问题的表述,因为似乎不够清晰。

所以,我们有数千家医院。他们的病人年龄在0到100岁之间。对于每个年龄,他们都有一定数量的患者,例如Hospital1 有 10 个 1 岁的患者,12 个 2 岁的患者,0 个 100 岁的患者等等。

enter image description here

以上数据集是一个小型简化示例,我的实际数据集包含数千家医院和数百万患者的数据。

寻求结果

我想知道每家医院的患者年龄中位数。

目前的解决方

展开表格,使每个患者的年龄有一个单独的行,然后取中位数。这将导致我的表有数亿行,这是不可取的。

library(dplyr)

## table
hospital <- c(rep(1:3,each = 10))
patient_age <- c(rep(seq(0,90,by = 10),3))
number_patients <- round(runif(30,100),0)
df <- bind_cols(hospital,patient_age,number_patients)
colnames(df) <- c("hospital","patient_age","number_patients")

## my impractical solution
df1 <- filter(df,hospital == 1)
df1a <- rep(df1$patient_age,df1$number_patients)
median(df1a)

## there's no way I can repeat this for each hospital (there are 1000s) 

解决方法

编辑

以下是按医院计算平均患者年龄的方法:

df %>%
  group_by(hospital) %>%
  summarise(
    mean_age = sum(patient_age*number_patients)/sum(number_patients)
    )

或者简单地说:

df %>%
  group_by(hospital) %>%
  summarise(
    mean_age = mean(rep(patient_age,number_patients))
  )

这是中位数:

df %>%
  group_by(hospital) %>%
  summarise(
    median_age = sort(rep(patient_age,number_patients))[length(rep(patient_age,number_patients))/2]
  )

这里,我们对其中间值 sort(rep(patient_age,number_patients)) 进行子集化,即 length(rep(patient_age,number_patients))/2

编辑 2

或者简单地说:

df %>%
  group_by(hospital) %>%
  summarise(
    median_age = median(rep(patient_age,number_patients))
  )

版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。