在R语言中计算医院ID与病症频次并生成对应新列
解决方案:按医院分组统计病例及各病情频次
先确认原始数据:
Demography <- read.table(text=" Pat_ID Gender Hospital_ID Condition P1 M A434 Normal P2 F A232 Average P3 F A331 Critical P4 M A434 Below_Critical P5 F A212 Average P6 F A331 Average P7 F A212 Critical P8 F A434 Average P9 F A331 Critical P10 M A232 Below_Critical", header=TRUE)
这里提供两种实现方案,都能得到你想要的输出:
方案一:使用tidyverse工具包(dplyr + tidyr)
这是更简洁的现代R数据处理方式,需先安装并加载tidyverse:
# 未安装的话先运行:install.packages("tidyverse") library(tidyverse) result <- Demography %>% group_by(Hospital_ID) %>% mutate(Hospital_Freq = n()) %>% count(Condition, Hospital_Freq) %>% pivot_wider( names_from = Condition, values_from = n, values_fill = 0, names_glue = "{Condition}_Freq" ) %>% ungroup() %>% select(Hospital_ID, Hospital_Freq, everything()) print(result)
运行输出:
# A tibble: 4 × 6 Hospital_ID Hospital_Freq Average_Freq Normal_Freq Critical_Freq Below_Critical_Freq <chr> <int> <int> <int> <int> <int> 1 A212 2 1 0 1 0 2 A232 2 1 0 0 1 3 A331 3 1 0 2 0 4 A434 3 1 1 0 1
方案二:使用base R实现
无需额外安装包,仅用基础R函数即可完成:
# 生成医院与病情的交叉频数表 condition_crosstab <- table(Demography$Hospital_ID, Demography$Condition) # 转换为数据框并计算各医院总病例数 result_base <- as.data.frame.matrix(condition_crosstab) result_base$Hospital_Freq <- rowSums(result_base) # 调整列名格式 colnames(result_base) <- paste0(colnames(result_base), "_Freq") result_base$Hospital_ID <- rownames(result_base) # 匹配期望的列顺序 result_base <- result_base[, c("Hospital_ID", "Hospital_Freq", "Average_Freq", "Normal_Freq", "Critical_Freq", "Below_Critical_Freq")] # 重置行名 rownames(result_base) <- NULL print(result_base)
运行输出:
Hospital_ID Hospital_Freq Average_Freq Normal_Freq Critical_Freq Below_Critical_Freq 1 A212 2 1 0 1 0 2 A232 2 1 0 0 1 3 A331 3 1 0 2 0 4 A434 3 1 1 0 1
内容的提问来源于stack exchange,提问作者Usman YousafZai
相关产品推荐
相关产品推荐

