【问题标题】:Is there a better method of splitting character strings with different lengths and patterns in r?有没有更好的方法来分割r中不同长度和模式的字符串?
【发布时间】:2022-01-14 01:07:01
【问题描述】:

我有 12 个样本名称,由一个长字符串组成,但大多数样本名称的长度不同,并且都有不同的样本标识符(例如,一些被标记为 JKT-n,一些被标记为 sample_n 或 Sample_n)。我只想提取字符串中间的样本标识符部分,标记为“JKT-n”、“Sample_n”或“sample_n”。由于标识符不一致,我遇到了困难。以下是其中 3 个的示例:

data$sample
 [1] "Monocytes DF 2_E18_016e_20180411_JKT-6_01_normalized_Ungated_viSNE_FlowSOM.fcs"     
 [2] "Monocytes DHF 2_E19_014b_20190731_sample_32_01_normalized_Ungated_viSNE_FlowSOM.fcs"
 [3] "Monocytes DF 2_E19_014b_20190730_Sample_21_01_normalized_Ungated_viSNE_FlowSOM.fcs" 

这是我用来拆分字符串的方法,最终得到了我想要的。但是,我想知道是否有更简洁的方法可以做到这一点,因为它有点笨重。

data <- as.data.frame(clean_names(read_excel("Significant Citrus clusters.xlsx", )))
data$tmp <- substr(data$sample,34,nchar(data$sample)-40)
data$tmp2 <- gsub(pattern = c("Sample_"), replacement = "JKT-", x=data$tmp)
data$tmp3 <- gsub(pattern=c("_sample_"), replacement="JKT-", x=data$tmp2)
data$tmp4 <- gsub(pattern="_", replacement="", x=data$tmp3)
data$CohortID <- data$tmp4

data$CohortID
 [1] "JKT-6"  "JKT-8"  "JKT-12" "JKT-21" "JKT-26" "JKT-27" "JKT-4"  "JKT-9"  "JKT-22" "JKT-30" "JKT-32" "JKT-33"

谢谢

【问题讨论】:

    标签: r string split character


    【解决方案1】:

    您可以使用管道符号将第三行和第四行合并为一行代码:

        gsub(pattern=c("Sample_|_sample_"), replacement="JKT-", x=data$tmp2)
    

    【讨论】:

    • 太好了,谢谢!
    【解决方案2】:

    或者,在字符串中间出现在_JKT-_Sample__sample_ 之后与实际位置无关的数字可以通过正则表达式 与lookbehind(详见https://www.regular-expressions.info/lookaround.html)。

    paste0("JKT-", stringr::str_extract(data$sample, "(?<=_(JKT-|[sS]ample_))\\d+"))
    
    [1] "JKT-6"  "JKT-32" "JKT-21"
    

    对于字符串操作,我更喜欢 包而不是基本 R 函数,因为它具有一致的用户界面和函数命名。

    样本数据

    data <- data.frame(sample = c(
      "Monocytes DF 2_E18_016e_20180411_JKT-6_01_normalized_Ungated_viSNE_FlowSOM.fcs",
      "Monocytes DHF 2_E19_014b_20190731_sample_32_01_normalized_Ungated_viSNE_FlowSOM.fcs",
      "Monocytes DF 2_E19_014b_20190730_Sample_21_01_normalized_Ungated_viSNE_FlowSOM.fcs"
    ))
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2015-01-06
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2011-01-01
      • 1970-01-01
      • 1970-01-01
      • 2010-10-31
      相关资源
      最近更新 更多