【问题标题】:If string contains x do y in R如果字符串在 R 中包含 x do y
【发布时间】:2023-03-20 20:30:02
【问题描述】:

所以我有一个 ID 部分看起来像这样的数据框

ID
Anna1
Anna1
Anton2
Anton2

我想创建一个新变量,如果 ID 中有 1,则包含“1”,如果变量中有“2”,则包含 2。

到目前为止,我已经想出了这个

Fixations$test <- (ifelse(Fixations$ID %in% 1  ,"1", 
                              ifelse(Fixations$ID  %in% 2, "2", NA)))

显然,它不起作用,因为我对字符串的引用是错误的。谁能帮我解决这个问题?

提前致谢!

【问题讨论】:

    标签: r string


    【解决方案1】:

    你可以使用grepl:

    ifelse(grepl("1", Fixations$ID), "1", 
    ifelse(grepl("2", Fixations$ID), "2", NA))
    

    最后一个参数定义了当“1”或“2”都没有出现时要分配的值。

    【讨论】:

    • 如果真的只是在12 之间做出决定,即使2 - grepl("1", Fixations$ID) 也能解决问题。
    • 编辑了多个决策问题的答案。
    【解决方案2】:

    我们可以使用来自tidyr 包的extract_numeric

    library(tidyr)
    library(dplyr)
    df %>% 
        mutate(test = extract_numeric(ID))
    

    输出:

          ID test
    1  Anna1    1
    2  Anna1    1
    3 Anton2    2
    4 Anton2    2
    

    【讨论】:

      【解决方案3】:

      使用case_when

      library(dplyr)
      library(stringr)
      Fixations %>% 
          mutate(test = case_when(str_detect(ID, '1$')~ 1,
             str_detect(ID, '2$') ~ 2))
            ID test
      1  Anna1    1
      2  Anna1    1
      3 Anton2    2
      4 Anton2    2
      

      另一个选项是parse_number

      readr::parse_number(Fixations$ID)
      [1] 1 1 2 2
      

      数据

      Fixations <- structure(list(ID = c("Anna1", "Anna1", "Anton2", 
          "Anton2")), class = "data.frame", row.names = c(NA, 
      -4L))
      

      【讨论】:

        【解决方案4】:

        提取你想要的字符串怎么样?

        这将从ID 列中提取数字。

        stringr::str_extract(df$ID, '\\d+')
        #[1] "1" "1" "2" "2"
        

        如果您只对 1 和 2 值感兴趣并将其他数字设为 NA,您也可以在正则表达式中指定此类模式。

        stringr::str_extract(df$ID, '(1|2)$')
        

        【讨论】:

          猜你喜欢
          • 2021-07-01
          • 2018-09-06
          • 1970-01-01
          • 1970-01-01
          • 2018-07-08
          • 2010-11-29
          • 2020-09-01
          • 1970-01-01
          • 1970-01-01
          相关资源
          最近更新 更多