代码之家  ›  专栏  ›  技术社区  ›  tfmunkey

R-如果向量中的任何字符串出现在任意几列中,则返回布尔值

  •  0
  • tfmunkey  · 技术社区  · 8 年前

    我有一个很大的数据框架,其中每一行都表示入院。每次入院时,第5列至第24列中最多有20个诊断代码。

    Col1   Col2   Col3   Col4   Diag_1  Diag_2  Diag_3 ... Diag_20
    data   data   data   data   J123    F456    H789       E468
    data   data   data   data   T452    NA      NA         NA
    

    另外,我有一个向量( 风险代码 )长度为136的所有字符串。这些字符串是与截断的诊断代码类似的风险代码(例如J12正常,F4正常,H798不正常)。

    我希望在返回1的数据帧中添加一列,如果 任何 的风险代码类似于任何诊断代码。我不需要知道有多少,只要至少有一个。

    到目前为止,我尝试了以下几项,比其他尝试成功得多:

    for (in in 1:length(risk_codes){
        df$newcol <- apply(df,1,function(x) sum(grepl(risk_codes[i], x[c(5:24)])))
    }
    

    它适用于单个字符串,并在列中填充0表示没有类似代码,1表示类似代码,但当检查第二个代码时,所有内容都会被覆盖,依此类推,覆盖risk_codes向量的136个元素。

    有什么想法吗?对每一行的每一列中的每一个risk_code运行循环是不可行的。

    解决方案如下

    Col1   Col2   Col3   Col4   Diag_1  Diag_2  Diag_3 ... Diag_20   newcol
    data   data   data   data   J123    F456    H789       E468      1
    data   data   data   data   T452    NA      NA         NA        0
    

    例如,如果我的risk_codes包含J12、F4、T543。

    1 回复  |  直到 8 年前
        1
  •  1
  •   zelite    8 年前

    我们希望将grepl同时应用于所有risk_code。所以我们一次得到每行一个结果。我们可以这样做 sapply any .

    所以,我们可以去掉for循环,你的代码变成这样:

    my_df <- read.table(text="Col1   Col2   Col3   Col4   Diag_1  Diag_2  Diag_3  Diag_20
    data   data   data   data   J123    F456    H789       E468
    data   data   data   data   T452    NA      NA         NA", header=TRUE)
    
    risk_codes <- c("F456", "XXX") # test codes
    
    my_df$newcol <- apply(my_df,1,function(x) 
                                      any(sapply(risk_codes, 
                                                  function(codes) grepl(codes,
                                                                  x[c(5:24)]))))
    

    结果是一个逻辑向量。

    如果您仍然想使用1和0而不是TRUE/FALSE,您只需要完成以下操作:

    my_df$new_col <- ifelse(my_df$newcol, 1, 0)
    

    结果将是:

    > my_df
      Col1 Col2 Col3 Col4 Diag_1 Diag_2 Diag_3 Diag_20 newcol
    1 data data data data   J123   F456   H789    E468      1
    2 data data data data   T452   <NA>   <NA>    <NA>      0