代码之家  ›  专栏  ›  技术社区  ›  M.Teich

按多个条件从因子列创建新列

  •  0
  • M.Teich  · 技术社区  · 7 年前

    我想从包含多个因素的现有列创建一个新列,但其中的部分因素名称再次出现。我来举例说明:

    factorA <- c("paul173643738","paul827484","george39585496","george7848658946","john2354674","john346","ringo384934","ringo24653")
    df <- data.frame(factorA)
    

    这是我的尝试:

    library(dplyr)
        df <- mutate(
               df,factorB = case_when(
               matches(factorA,"paul.") ~ "paul",
               matches(factorA,"george.") ~ "george",
               matches(factorA,"john.") ~ "john",
               matches(factorA,"ringo.") ~ "ringo",
               TRUE ~ "NA"))
    

    这给了我 Error in mutate_impl(.data, dots) : Evaluation error: is_string(match) is not TRUE. 我认为这是我没有正确说明 R 应该是在找我想要的绳子碎片。

    结果应该是这样的:

               factorA  factorB
    1    paul173643738  paul
    2       paul827484  paul 
    3   george39585496  george
    4 george7848658946  george
    5      john2354674  john
    6          john346  john
    7      ringo384934  ringo
    8       ringo24653  ringo
    

    我相信这个问题以前有人问过,但我找不到任何适合我需要的答案。任何帮助都将不胜感激。

    5 回复  |  直到 7 年前
        1
  •  1
  •   Felipe Flores    7 年前

    你可以用 stringr::str_detect :

    library(tidyverse)
    factorA <- c("paul173643738","paul827484","george39585496","george7848658946","john2354674","john346","ringo384934","ringo24653")
    df <- as_data_frame(factorA)
    df %>% 
      mutate(factorB = case_when(
        str_detect(factorA, "paul") ~ "paul",
        str_detect(factorA, "george") ~ "george",
        str_detect(factorA, "john") ~ "john",
        str_detect(factorA, "ringo") ~ "ringo"
      ))
    #> # A tibble: 8 x 2
    #>   value            factorB
    #>   <chr>            <chr>  
    #> 1 paul173643738    paul   
    #> 2 paul827484       paul   
    #> 3 george39585496   george 
    #> 4 george7848658946 george 
    #> 5 john2354674      john   
    #> 6 john346          john   
    #> 7 ringo384934      ringo  
    #> 8 ringo24653       ringo
    
        2
  •  1
  •   Thor6    7 年前

    使用 stringr

    library(stringr)
    df %>%
    mutate(factorB = case_when(
    str_detect(factorA, 'paul') ~ 'paul',
    str_detect(factorA,"paul.") ~ "paul",
    str_detect(factorA,"george.") ~ "george",
    str_detect(factorA,"john.") ~ "john",
    str_detect(factorA,"ringo.") ~ "ringo"
    ))
    
        3
  •  1
  •   Lucas Cardozo    7 年前

    如果 factorA 是固定的,可以使用 gsub :

    only_names <- gsub('(^[A-Za-z]*).*', '\\1', factorA)
    
        4
  •  1
  •   Jilber Urbina    7 年前

    使用R基 sub 带正则表达式

    > data.frame(factorA, factor8=sub("\\d+", "", factorA))
               factorA factor8
    1    paul173643738    paul
    2       paul827484    paul
    3   george39585496  george
    4 george7848658946  george
    5      john2354674    john
    6          john346    john
    7      ringo384934   ringo
    8       ringo24653   ringo
    
        5
  •  0
  •   Nettle    7 年前

    尝试 extract 以及一个只检测字母的正则表达式。

    my.regex <- "([a-z]+)"
    
    df %>% 
      extract(factorA, 
              into = "factorB", 
              regex = my.regex,
              remove = FALSE)
    
    #>            factorA factorB
    #> 1    paul173643738    paul
    #> 2       paul827484    paul
    #> 3   george39585496  george
    #> 4 george7848658946  george
    #> 5      john2354674    john
    #> 6          john346    john
    #> 7      ringo384934   ringo
    #> 8       ringo24653   ringo
    

    通常,我会追求更清晰的数据,尽管,离散的值和名称。。。。

     my.regex <- "([a-z]+)([0-9]+)"        
    
      df %>% 
      extract(factorA, 
              into = c("factorA", "factorB"), 
              regex = my.regex,
              remove = FALSE)
    
    #>   factorA    factorB
    #> 1    paul  173643738
    #> 2    paul     827484
    #> 3  george   39585496
    #> 4  george 7848658946
    #> 5    john    2354674
    #> 6    john        346
    #> 7   ringo     384934
    #> 8   ringo      24653
    ```
    

    于2018年7月28日由 reprex package (第0.2.0版)。

    推荐文章