You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

多列反向筛选并统计非目标手术编号的出现次数

统计筛选后数据集中非目标手术编号的出现次数

首先,先回顾一下我们的数据集、目标编号和筛选逻辑:

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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.05.28 09:51:47