如何在R语言中多列搜索指定范围的ICD-9诊断编码
批量检查ICD-9编码列是否存在指定范围值
看起来你已经搞定了单列的搜索逻辑,现在要把这个逻辑扩展到Dx1到Dx30这30列对吧?针对大型DataFrame,咱们得兼顾可读性和执行效率,下面给你两种实用的方案:
方案1:Pandas Apply 直观实现
这种写法更贴近你现有的单列逻辑,容易理解和调试:
# 1. 定义目标编码范围 DXrange = (起始值, 结束值) # 比如DXrange = (120, 130) # 2. 筛选出Dx1到Dx30的列名 dx_columns = [f"Dx{i}" for i in range(1, 31)] # 3. 逐行检查:只要任意一列的编码在范围内,就标记为True df["has_target_diagnosis"] = df[dx_columns].apply( lambda row: row.between(*DXrange).any(), axis=1 # 按行处理 )
逻辑解释:
row.between(*DXrange)会对当前行的每一个Dx列生成布尔值(是否在范围内).any()判断这一行里是否至少有一个True,也就是是否存在符合条件的编码
方案2:Numpy 向量化操作 高效处理大型DataFrame
如果你的DataFrame行数特别多(比如百万级),上面的apply可能有点慢,用Numpy的向量化操作会快很多:
import numpy as np # 同样先定义范围和目标列 DXrange = (起始值, 结束值) dx_columns = [f"Dx{i}" for i in range(1, 31)] # 向量化判断:所有Dx列同时检查是否在范围内,再按行取任意True df["has_target_diagnosis"] = np.any( (df[dx_columns] >= DXrange[0]) & (df[dx_columns] <= DXrange[1]), axis=1 )
优势:
Numpy的广播机制会把整个列的操作转化为底层的C语言运算,比Pandas的apply循环快很多,适合处理你的大型数据集。
额外扩展:如果需要知道具体哪一列匹配
要是你还想知道每行是哪一列的编码符合条件,可以加这一步:
df["matching_dx_column"] = df[dx_columns].apply( lambda row: row[row.between(*DXrange)].index[0] if row.between(*DXrange).any() else None, axis=1 )
这样matching_dx_column列会存储第一个匹配的Dx列名(比如"Dx3"),没有匹配的话就是None。
内容的提问来源于stack exchange,提问作者RROBINSON
相关产品推荐
相关产品推荐

