如何在R的DataFrame中定位首个感染ICD-10码列及POA状态
解决方案
步骤1:新增infxn_col_name列(首个感染编码的列名)
利用dplyr的rowwise()结合c_across()逐行处理ICD编码列,定位首个匹配感染编码的列名:
library(dplyr) DF <- DF %>% rowwise() %>% mutate( infxn_col_name = { # 获取当前行所有ICD编码列的值 icd_row_vals <- c_across(all_of(ICD10_code_columns)) # 找到第一个属于感染编码的位置索引 first_match_idx <- which(icd_row_vals %in% ICD10_infxn)[1] # 根据索引返回对应列名,无匹配则返回NA if (!is.na(first_match_idx)) ICD10_code_columns[first_match_idx] else NA_character_ } ) %>% ungroup()
步骤2:新增对应POA状态列
根据POA列的命名规则,有两种常见实现方式:
情况1:已知POA列名向量(推荐)
如果有与ICD10_code_columns顺序完全对应的POA列名向量POA_columns,先建立ICD到POA的列名映射:
# 建立ICD列名到POA列名的映射 icd_to_poa <- setNames(POA_columns, ICD10_code_columns) DF <- DF %>% rowwise() %>% mutate( poa_status = if (!is.na(infxn_col_name)) get(icd_to_poa[infxn_col_name]) else NA ) %>% ungroup()
情况2:通过字符串规则推导POA列名
如果POA列名是ICD列名的固定替换(比如把ICD替换为POA),用stringr做字符串替换:
library(stringr) DF <- DF %>% rowwise() %>% mutate( poa_status = if (!is.na(infxn_col_name)) { # 推导对应POA列名 poa_col_name <- str_replace(infxn_col_name, "ICD", "POA") get(poa_col_name) } else NA ) %>% ungroup()
完整整合代码
将两步合并,一次性生成两个新列:
library(dplyr) library(stringr) # 假设有POA列名向量的情况 icd_to_poa <- setNames(POA_columns, ICD10_code_columns) DF <- DF %>% rowwise() %>% mutate( infxn_col_name = { icd_row_vals <- c_across(all_of(ICD10_code_columns)) first_match_idx <- which(icd_row_vals %in% ICD10_infxn)[1] if (!is.na(first_match_idx)) ICD10_code_columns[first_match_idx] else NA_character_ }, poa_status = if (!is.na(infxn_col_name)) get(icd_to_poa[infxn_col_name]) else NA ) %>% ungroup()
关于之前的报错原因
max.col()仅支持数值/逻辑类型的矩阵,你的ICD编码是字符类型,直接传入会触发类型不匹配错误;apply()虽能处理字符列,但索引处理逻辑繁琐,不如dplyr的rowwise()方案直观且符合你的使用习惯。
内容的提问来源于stack exchange,提问作者C Chen
相关产品推荐
相关产品推荐

