【问题标题】:Best option to search for characters in a column using R使用 R 在列中搜索字符的最佳选择
【发布时间】:2021-10-16 05:44:17
【问题描述】:

我有一个包含不同代码 (ICD-10) 的列的 df。该列包含由 4 个字母数字字符组成的代码。我想仅根据前两个字符搜索特定代码。例如,如果这是列

codes = c("s001", "s1234", "s4g6", "T002", "T191","t985","s761","t17.5")

我想要它包含S0, S1, T0, T9, T1 的所有行,如果不存在,则将其分配为 1 和 0。我以前在 case_when 中使用过 %like%。但是,我想知道在 R.Thanks 中是否有有效的方法来做到这一点

【问题讨论】:

    标签: r regex


    【解决方案1】:

    您也可以使用子字符串方法。使用substr 仅从codes 中提取前2 个字符,并将其与correct_values 进行比较。

    codes = c("s001", "s1234", "s4g6", "T002", "T191","t985","s761","t17.5")
    
    correct_values <- c("s0", "s1", "T0", "T9", "T1")
    
    as.integer(substr(codes, 1, 2) %in% correct_values)
    #[1] 1 1 0 1 1 0 0 0
    

    【讨论】:

      【解决方案2】:

      grepl 的另一个选项

      > +grepl("^([sT][01]|T9)", codes)
      [1] 1 1 0 1 1 0 0 0
      

      【讨论】:

        【解决方案3】:

        我们可以定义一个您想要检测的模式,然后使用str_detect 并将 1 分配给 TRUE,将 0 分配给 FALSE:

        library(dplyr)
        library(stringr)
        
        # your dataframe with codes column
        df <- data.frame(codes = c("s001", "s1234", "s4g6", 
                                      "T002", "T191","t985",
                                      "s761","t17.5"))
        
        # define what you want to search for
        search_pattern <- "S0|S1|T0|T9|T1"
        
        # check with `str_detect`
        df %>% 
            mutate(check = ifelse(str_detect(df$codes, search_pattern)==TRUE, 1, 0)) 
        
        

        输出:

          codes check
        1  s001     0
        2 s1234     0
        3  s4g6     0
        4  T002     1
        5  T191     1
        6  t985     0
        7  s761     0
        8 t17.5     0
        

        【讨论】:

          【解决方案4】:

          我们可以使用

          +(grepl("^s[01]|^T[019]", codes))
          [1] 1 1 0 1 1 0 0 0
          

          【讨论】:

            【解决方案5】:

            使用grepl() 测试正则表达式并为任何以 s0、s1、T0、T1、T9 开头的字符串返回 true,否则返回 false。然后ifelse() 获取 TRUE 和 FALSE 的向量,并为 TRUE 分配 1,否则为 0。

            codes <- c("s001", "s1234", "s4g6", "T002", "T191","t985","s761","t17.5")
            
            ifelse(grepl("^s[01]|^T[019]", codes), 1, 0)
            

            输出:

            [1] 1 1 0 1 1 0 0 0
            

            还可以:

            as.numeric(grepl("^s[01]|^T[019]", codes))
            

            【讨论】:

            • 感谢您的回答。如果我正在搜索 S0,S1,S2,S3,S4,我可以使用 ifelse(grepl("^s[01234]") 吗?
            • 是的,或者“^s[0-4]”以获得更高的效率
            猜你喜欢
            • 1970-01-01
            • 2016-04-21
            • 2020-10-17
            • 2014-09-08
            • 2016-12-20
            • 1970-01-01
            • 1970-01-01
            • 1970-01-01
            • 2016-11-22
            相关资源
            最近更新 更多