使用grepl()提取两个元素

问题描述 投票:0回答:1

我有一个名为“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”。请看下面:

非常欢迎任何帮助!

r grepl
1个回答
0
投票

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

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

© www.soinside.com 2019 - 2024. All rights reserved.