如何简化多列重复代码?从ECG1-ECG20搜索831的优化方法
简洁高效的data.table实现方案
因为你使用的是data.table语法,完全不需要重复编写20行判断代码,以下是两种简洁的实现方式:
方法一:使用Reduce逐行逻辑或运算
# 初始化af_exist为0 af[, af_exist := 0] # 一次性匹配ECG1至ECG20列,将存在"831"的行的af_exist设为1 af[Reduce(`|`, lapply(.SD, `%in%`, "831")), af_exist := 1, .SDcols = paste0("ECG", 1:20)]
代码说明
paste0("ECG", 1:20):自动生成ECG1到ECG20的列名,避免手动输入.SDcols:指定要操作的目标列集合lapply(.SD,%in%, "831"):遍历目标列,生成每个列是否包含"831"的逻辑向量列表Reduce(|, ...):对每行的逻辑向量做或运算,只要任意一列匹配"831",该行结果就为TRUE- 最后通过逻辑筛选,将对应行的
af_exist赋值为1
方法二:使用rowSums统计匹配次数
如果觉得逻辑或的写法不够直观,也可以用行求和的方式判断:
# 初始化af_exist为0 af[, af_exist := 0] # 统计每行匹配"831"的列数,大于0则设为1 af[rowSums(sapply(.SD, `%in%`, "831")) > 0, af_exist := 1, .SDcols = paste0("ECG", 1:20)]
代码说明
rowSums(...):统计每行中包含"831"的列的数量- 只要数量大于0,就说明该行存在匹配值,将
af_exist设为1
内容的提问来源于stack exchange,提问作者li jiaqi
相关产品推荐
相关产品推荐

