微信公众号搜"智元新知"关注
微信扫一扫可直接关注哦!

根据数据框中各行的目标向量计算字符串匹配

如何解决根据数据框中各行的目标向量计算字符串匹配

我有一个大型数据集(约 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 举报,一经查实,本站将立刻删除。