使用grepl()提取两个元素

72qzrwbm  于 2023-10-13  发布在  其他
关注(0)|答案(2)|浏览(57)

我有一个名为“data”的数据集,它看起来像这样:

我尝试创建一个新变量,名为“Group”,它将“FileName”变量中的元素编码为以下内容:

  • 含有HC元素的任何物质将被标记为“HC PBMC”
  • 任何含有SF和PBMC元素的东西都将被标记为“AS PBMC”
  • 任何含有SF和SFMC元素的东西都将被标记为“AS SFMC”

为了做到这一点,我写了这段代码:

data$Group<- ifelse(grepl("HC",data$FileName),"HC",
                    ifelse(grepl("SF & PBMC",data$FileName),"AS PBMC",
                           "AS SFMC"))

然而,任何含有SF和PBMC元素的物质都不能正确编码为“AS PBMC”。相反,它只是跳过了这个条件,并将其标记为“AS SFMC”。请参见下文:

任何帮助将是最受欢迎的!

jq6vz3qz

jq6vz3qz1#

首先要注意,“&”在正则表达式中没有逻辑“and”的含义。您当然可以使用一些复杂的正则表达式来实现您想要的功能,但是首先提取您考虑用于命名组的组件,然后在第二步中分配case,这样不是更透明吗?

library(tidyverse)

df <- tibble(
  FileName = c("HC1788 PBMC", "SF71 PBMC", "SF70_2 SFMC")
)

df |> 
  # extract components
  mutate(
    A = str_extract(FileName, "^HC|^SF"),
    B = str_extract(FileName, "PBMC$|SFMC$")
  ) |> 
  # assign groups
  mutate(Group = case_when(
    A == "HC" ~ "HC PBMC",
    A == "SF" & B == "PBMC" ~ "AS PBMC",
    A == "SF" & B == "SFMC" ~ "AS SFMC"
  ))
#> # A tibble: 3 × 4
#>   FileName    A     B     Group  
#>   <chr>       <chr> <chr> <chr>  
#> 1 HC1788 PBMC HC    PBMC  HC PBMC
#> 2 SF71 PBMC   SF    PBMC  AS PBMC
#> 3 SF70_2 SFMC SF    SFMC  AS SFMC

创建于2023-10-12使用reprex v2.0.2

gdrx4gfi

gdrx4gfi2#

根据您尝试的内容,一个简单的解决方案是:

data$Group <- ifelse(grepl("HC", data$FileName),
                     "HC",
                     ifelse(
                             grepl("SF", data$FileName) & grepl("PBMC", data$FileName),
                             "AS PBMC",
                             "AS SFMC"
                     ))

相关问题