【问题标题】:How to apply function startsWith to several patterns? [duplicate]如何将函数startsWith应用于几种模式? [复制]
【发布时间】:2020-11-10 08:32:08
【问题描述】:

我有一个数据框。我想为创建依赖于其他列的列编写条件。这里是:

tab <- tibble::tribble(
  ~dataset_id,  ~type,
     "Site4H",      268,
     "Site4D",      479,
     "SIte8H",      345,
     "Site8D",      567,
     "Site8K",      507
  )
library(dplyr)
tab %>%
  mutate(state = case_when(
    endsWith(dataset_id, "H") ~ "healthy",
    endsWith(dataset_id, "D") ~ "disease",
    TRUE                      ~ NA_character_
  ))

【问题讨论】:

标签: r dataframe stringr


【解决方案1】:

您可以将正则表达式与 rebus 包一起用于您的任务

library(dplyr)
library(rebus)
library(stringi)

# look for a string ending with H or K
pattern <- or("H", "K") %R% END

# gives you true if pattern is found else false (you can negate that with ! in fron of stringi
tab %>% 
  dplyr::mutate(state = stringi::stri_detect_regex(dataset_id, pattern))

  dataset_id bacteria state
  <chr>         <int> <lgl>
1 Site4H          268 TRUE 
2 Site4D          479 FALSE
3 SIte8H          345 TRUE 
4 Site8D          567 FALSE
5 Site8K          567 TRUE 

【讨论】:

    【解决方案2】:

    你可以使用grepl/str_detect来匹配模式。

    要匹配“H”或“K”,您可以这样写:

    library(dplyr)
    
    tab %>%
      mutate(state = case_when(
        grepl('H|K', dataset_id) ~ "healthy",
        endsWith(dataset_id, "D") ~ "disease",
        TRUE                      ~ NA_character_
      ))
    
    #   dataset_id bacteria state  
    #  <chr>         <int> <chr>  
    #1 Site4H          268 healthy
    #2 Site4D          479 disease
    #3 SIte8H          345 healthy
    #4 Site8D          567 disease
    #5 Site8K          567 healthy
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2012-07-05
      • 1970-01-01
      • 2012-07-28
      • 2022-07-27
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多