如何在 R 中获得频率 table 的中位数?
How to get median with frequency table in R?
问题
我更改了问题的表述方式,因为似乎不够清晰。
所以,我们有成千上万家医院。他们的患者年龄在 0 到 100 岁之间。对于每个年龄段,他们都有一定数量的患者,例如Hospital1 有 10 名 1 岁的患者,12 名 2 岁的患者,0 名 100 岁的患者等
上面的数据集是一个小而简化的例子,我的实际数据集包含数千家医院和数百万患者的数据。
寻求的结果
我想知道每家医院的患者年龄中位数。
目前的解决方案
展开 table 以便每个患者的年龄都有一个单独的行,然后取中位数。这将导致我的 table 有数亿行,因此是不可取的。
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, 0, 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))
)
问题
我更改了问题的表述方式,因为似乎不够清晰。
所以,我们有成千上万家医院。他们的患者年龄在 0 到 100 岁之间。对于每个年龄段,他们都有一定数量的患者,例如Hospital1 有 10 名 1 岁的患者,12 名 2 岁的患者,0 名 100 岁的患者等
上面的数据集是一个小而简化的例子,我的实际数据集包含数千家医院和数百万患者的数据。
寻求的结果
我想知道每家医院的患者年龄中位数。
目前的解决方案
展开 table 以便每个患者的年龄都有一个单独的行,然后取中位数。这将导致我的 table 有数亿行,因此是不可取的。
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, 0, 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))
)