【问题标题】:Flagging a variable which contains a string from a list标记包含列表中字符串的变量
【发布时间】:2021-10-21 06:17:16
【问题描述】:

我正在尝试制作一个标志,以记录变量包含给定列表中的一个单词的位置。我已经使用 dplyr 库中的 starwars 数据集编写了一个示例。

starwars <- starwars

name_of_characters <- c("Luke", "Han", "Jabba", "Anakin")

starwars$flag <- ifelse(starwars$name %in% name_of_characters, "Flag", "")
starwars$flag_2 <- ifelse(grep(name_of_characters, starwars$name), "Flag", "")

所以我在这里要做的是创建一个flag 列,该列将识别名称包含“Luke”、“Han”、“Jabba”“Anakin”的字符。在这些名称存在的地方,我希望我的专栏简单地说“标志”。我确信有一种更简单的方法可以做到这一点,但我一直找不到。作为参考,我希望它类似于 Excel 中的 Find() 函数或 SAS 中的 Contains 函数。

【问题讨论】:

    标签: r regex string


    【解决方案1】:

    首先paste0你的名字变成一个正则表达式交替模式:

    name_of_characters_pattern <- paste0(name_of_characters, collapse = "|")
    

    现在用greplinside ifelse来插“旗”:

    starwars$flag <- ifelse(grepl(name_of_characters_pattern, starwars$name),"Flag","")
    

    【讨论】:

      【解决方案2】:

      你不需要将ifelse 与矢量化的grepl 函数一起使用,感觉很不雅。简单的解决方案是将greplfactor 函数一起使用:

      data("starwars")
      
      pattern <- paste(c('Luke', 'Han', 'Jabba', 'Anakin'), sep = '', collapse = '|')
      
      starwars$flag <- factor(grepl(pattern, starwars$name), labels = c('', 'Flag'))
      
      head(starwars[, c('name', 'flag')])
      
      
      # # A tibble: 6 x 2
      #   name           flag  
      #   <chr>          <fct> 
      # 1 Luke Skywalker "Flag"
      # 2 C-3PO          ""    
      # 3 R2-D2          ""    
      # 4 Darth Vader    ""    
      # 5 Leia Organa    ""    
      # 6 Owen Lars      "" 
      
      cat(sum(starwars$flag == 'Flag'), ' out of ', nrow(starwars), ' rows.')
      
      # 4  out of  87  rows.
      
      starwars[starwars$flag == 'Flag', c('name', 'flag')]
      
      #  # A tibble: 4 x 2
      #   name                  flag 
      #   <chr>                 <fct>
      # 1 Luke Skywalker        Flag 
      # 2 Anakin Skywalker      Flag 
      # 3 Han Solo              Flag 
      # 4 Jabba Desilijic Tiure Flag
      

      【讨论】:

        【解决方案3】:

        类似于Chris Ruehelmann's answer。这里使用stringr 动词。 在filter 作为最后一行之后,您将获得FLAGrows:

        library(dplyr)
        library(stringr)
        
        pattern <- str_c(as.character(name_of_characters), collapse = "|")
        
        starwars %>% 
            mutate(flag = if_else(str_detect(name, pattern), "FLAG", NA_character_), .before = 1) %>% 
            filter(flag == "FLAG")
        
          flag  name                  height  mass hair_color skin_color       eye_color birth_year sex            gender    homeworld species films     vehicles  starships
          <chr> <chr>                  <int> <dbl> <chr>      <chr>            <chr>          <dbl> <chr>          <chr>     <chr>     <chr>   <list>    <list>    <list>   
        1 FLAG  Luke Skywalker           172    77 blond      fair             blue            19   male           masculine Tatooine  Human   <chr [5]> <chr [2]> <chr [2]>
        2 FLAG  Anakin Skywalker         188    84 blond      fair             blue            41.9 male           masculine Tatooine  Human   <chr [3]> <chr [2]> <chr [3]>
        3 FLAG  Han Solo                 180    80 brown      fair             brown           29   male           masculine Corellia  Human   <chr [4]> <chr [0]> <chr [2]>
        4 FLAG  Jabba Desilijic Tiure    175  1358 NA         green-tan, brown orange         600   hermaphroditic masculine Nal Hutta Hutt    <chr [3]> <chr [0]> <chr [0]>
        

        【讨论】:

          猜你喜欢
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 2021-05-22
          • 1970-01-01
          • 2012-09-05
          • 1970-01-01
          相关资源
          最近更新 更多