多列反向筛选并统计非目标手术编号的出现次数
统计筛选后数据集中非目标手术编号的出现次数
首先,先回顾一下我们的数据集、目标编号和筛选逻辑:
1. 原始数据集定义
PatientNum<- c(1, 2, 3, 4, 5,6,7) Age<- c(10, 21, 51, 42, 35,99,25) SurgicalProcedureNumber <- c(21356, 21424, 221356, NA, 12345, 54321,NA) OtherSurgicalProcedureNumber <- c(54321, NA, 21356, 12345, NA,12345, 21424) BloodLoss<-c(5,4,5,10,5,15,9) YetAnotherSurgicalProcedureNumber<-c(11111,22222,NA, 33333,21356,555555,NA) dataset <- data.frame(PatientNum, Age, SurgicalProcedureNumber, OtherSurgicalProcedureNumber, BloodLoss,YetAnotherSurgicalProcedureNumber)
2. 目标手术编号
NumbersIcareAbout<- c(21356,21424)
3. 筛选包含目标编号的患者数据
(记得先加载dplyr包)
library(dplyr) NewData<-dataset %>% filter(SurgicalProcedureNumber %in% NumbersIcareAbout | OtherSurgicalProcedureNumber %in% NumbersIcareAbout | YetAnotherSurgicalProcedureNumber %in% NumbersIcareAbout)
接下来是你需要的统计逻辑:统计NewData中非NA且不属于目标编号的手术编号在所有手术列中的出现次数。这里提供两种实用的实现方式:
方法一:使用tidyr + dplyr(管道式操作,推荐)
这种方式代码更清晰,适合处理多列数据的统一操作:
library(tidyr) # 统计非目标、非NA的手术编号出现次数 non_target_counts <- NewData %>% # 选中所有手术编号相关的列(这里用匹配列名前缀的方式,也可以直接列出来) select(starts_with("SurgicalProcedureNumber"), OtherSurgicalProcedureNumber, YetAnotherSurgicalProcedureNumber) %>% # 将宽表转为长格式,把所有手术编号放到同一列 pivot_longer(cols = everything(), names_to = "procedure_column", values_to = "procedure_number") %>% # 过滤掉NA值和属于目标编号的记录 filter(!is.na(procedure_number), !procedure_number %in% NumbersIcareAbout) %>% # 统计每个编号的出现次数,并重命名次数列 count(procedure_number, name = "occurrence_count") %>% # 按出现次数降序排列,方便查看高频编号 arrange(desc(occurrence_count)) # 查看结果 non_target_counts
代码说明:
select:精准选中所有存储手术编号的列,避免包含年龄、患者ID等无关列;pivot_longer:把多列手术编号合并成一列,这是处理多列同类数据的关键步骤;filter:剔除不需要的记录(NA值和你关心的目标编号);count:一键统计每个剩余编号的出现次数;arrange:让结果按次数从多到少排序,更直观。
方法二:基础R实现(无需额外加载包)
如果你不想加载tidyr,可以用基础R代码实现:
# 提取所有手术编号列 procedure_columns <- NewData[, c("SurgicalProcedureNumber", "OtherSurgicalProcedureNumber", "YetAnotherSurgicalProcedureNumber")] # 把所有列的元素合并成一个向量,并去掉NA值 all_procedures <- na.omit(unlist(procedure_columns)) # 过滤掉目标编号,只保留需要统计的部分 non_target_procedures <- all_procedures[!all_procedures %in% NumbersIcareAbout] # 统计每个编号的出现次数 non_target_counts_table <- table(non_target_procedures) # 转为数据框格式(可选,比表格更易读) non_target_counts_df <- as.data.frame(non_target_counts_table, stringsAsFactors = FALSE) colnames(non_target_counts_df) <- c("procedure_number", "occurrence_count") # 查看结果 non_target_counts_df
代码说明:
unlist:把数据框的多列合并成一个一维向量;na.omit:直接移除向量中的NA值;table:基础R中用来统计元素出现次数的函数;- 最后转为数据框是为了让结果的列名更清晰,方便后续处理。
两种方法最终都会得到相同的统计结果,你可以根据自己的习惯选择使用。
内容的提问来源于stack exchange,提问作者Joe Crozier
相关产品推荐
相关产品推荐

