问题描述
我有一个大型数据集(约 520,000 行和 1,000 列)。这些列的一个子集是 ICD 代码。我想对每一行(在包含 ICD 代码的列子集中)执行求和,计算 ICD 代码条目与感兴趣的 ICD 代码列表相匹配的所有列。然后我想创建一个新的指标列,如果 rowsum 超过 0(即,如果任何列具有与我的列表匹配的 ICD 代码),则值为 1,如果没有与目标列表匹配的条目的列,则值为 0 ICD 代码。这是一个使用假数据集的简单、可重现的示例:
# create fake dataset
id <- c(500,550,560)
icd.1 <- c("C00","F14","H15")
icd.2 <- c("F10","G45","A40")
icd.3 <- c(NA,"A16","F13")
dat <- as.data.frame(cbind(id,icd.1,icd.2,icd.3))
# vector of ICD codes to search for
icd_include <- c("C00","G46","F13")
# vector of column names to search
icd_all <- paste0("icd.",seq(1,3))
如果我想匹配单个字符值,那么 rowSums 为我提供了完美的解决方案:
dat$event <- ifelse(rowSums(dat[icd_all] == "C00") > 0,1,0)
dat
id icd.1 icd.2 icd.3 event
1 500 C00 F10 <NA> 1
2 550 F14 G45 A16 0
3 560 H15 A40 F13 0
我想对 icd_include 向量中的所有条目执行匹配的 rowSums 以产生以下输出:
id icd.1 icd.2 icd.3 event
1 500 C00 F10 <NA> 1
2 550 F14 G45 A16 1
3 560 H15 A40 F13 1
但是,在尝试匹配包含许多可能字符串的向量时,我似乎无法使其正常工作。在我看来,尝试此操作的合乎逻辑的方法是使用以下代码:
dat$event <- ifelse(rowSums(dat[icd_all] %in% icd_include,na.rm = TRUE) > 0,0)
但这不起作用并产生以下错误:
Error in rowSums(dat[icd_all] %in% icd_include) :
'x' must be an array of at least two dimensions
我目前的解决方法是为每一列 ICD 代码创建一个虚拟列,然后在这些代码中执行 rowSums:
dat$event.1 <- ifelse(dat[[icd_all[1]]] %in% icd_include,0)
dat$event.2 <- ifelse(dat[[icd_all[2]]] %in% icd_include,0)
dat$event.3 <- ifelse(dat[[icd_all[3]]] %in% icd_include,0)
dat$event <- ifelse(rowSums(dat[event.1:event.3],0)
但这对我来说似乎很笨拙,我想要一种更直接的方法,我不需要创建所有这些虚拟列。任何人都可以请提出一种编码方法吗?我尝试了多种方法并在网上详尽搜索,但无济于事。将特别感谢基础 R 或 data.table(以加快计算速度)中的建议解决方案。
解决方法
暂无找到可以解决该程序问题的有效方法,小编努力寻找整理中!
如果你已经找到好的解决方法,欢迎将解决方案带上本链接一起发送给小编。
小编邮箱:dio#foxmail.com (将#修改为@)