【问题标题】:Replace words in data frame using list of words in another data frame in R使用R中另一个数据框中的单词列表替换数据框中的单词
【发布时间】:2020-11-11 17:27:44
【问题描述】:

我正在尝试将大型 R 数据框(300 万行患者乘以 400 列诊断)从简短描述(例如“基本高血压,良性”)转换为描述 ICD 代码,例如“I10”。简短描述位于数据框“DATA”中,还包括我不想更改的患者 ID 和年龄列。数据框“字典”是我包含简短描述和相关 ICD 代码的单词列表。实际字典列表中有超过 20k 的描述和 ICD 代码组合。为了使问题可重现,我包含了重新创建较大 DATA 和 Dictionary 数据帧的小样本的代码。

数据样本

PAT_ID <- c(1,2,3)

DX_1 <- c('OTHER&UNSPECIFIED HYPERLIPIDEMIA','NA','ESSENTIAL HYPERTENSION, BENIGN' )

DX_AGE_1 <- c(66,68,75)

DX_2 <- c('ESSENTIAL HYPERTENSION, BENIGN','SPECIAL SCR MALIG NEOPLASM PROS','NA' )

DX_AGE_2 <- c(67,69,77)

DATA <- data.frame(PAT_ID, DX_1, DX_AGE_1,DX_2,DX_AGE_2)

字典样本

From <- c('OTHER&UNSPECIFIED HYPERLIPIDEMIA','ESSENTIAL HYPERTENSION, BENIGN','SPECIAL SCR MALIG NEOPLASM PROS')

To <- c('E784', 'I10', 'Z125')
    
Dictionary <- data.frame(From, To)

我想要的输出看起来像这段代码的输出

PAT_ID <- c(1,2,3)
DX_1 <- c('E784','NA','I10' )
DX_AGE_1 <- c(66,68,75)
DX_2 <- c('I10','Z125','NA' )
DX_AGE_2 <- c(67,69,77)
OUTPUT <- data.frame(PAT_ID, DX_1, DX_AGE_1,DX_2,DX_AGE_2)

非常感谢您的帮助!

【问题讨论】:

    标签: r


    【解决方案1】:

    使用 Base R,您可以:

    vec <- do.call(setNames,rev(unname(Dictionary)))
    rapply(DATA, function(x)vec[x],'character', how= 'replace')
    
      PAT_ID DX_1 DX_AGE_1 DX_2 DX_AGE_2
    1      1 E784       66  I10       67
    2      2 <NA>       68 Z125       69
    3      3  I10       75 <NA>       77
    

    你也可以使用stringr中的str_replace_all

    setNames(type.convert(data.frame(
             array(str_replace_all(as.matrix(DATA), vec), dim(DATA)))), names(DATA))
      PAT_ID DX_1 DX_AGE_1 DX_2 DX_AGE_2
    1      1 E784       66  I10       67
    2      2 <NA>       68 Z125       69
    3      3  I10       75 <NA>       77
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2014-03-11
      • 1970-01-01
      • 2021-02-03
      • 2020-07-06
      • 1970-01-01
      • 2020-12-27
      • 2022-06-23
      • 2021-10-14
      相关资源
      最近更新 更多