使用 qsub 或 R-strings 更改 R 中的复杂字符串

Change complicated strings in R with qsub or R-strings

我有一列数据框,其中有数千个像这样的复杂样本名称

sample- c("16_3_S16_R1_001", "16_3_S16_R2_001", "2_3_S2_R1_001","2_3_S2_R2_001")

我正在尝试更改示例名称以实现以下示例名称,但没有成功 16.3R1, 16.3R2, 2.3R1,2.3R2

我正在考虑用 qsub 或 stringsR 解决问题。 有什么建议吗?我试过 qsub 但没有检索到所需的名称

这是您可以做到的一种方法。

它有助于创建一个包含 header 列的数据框,所以这就是我在下面所做的,我将该列命名为“cats”

trial <- data.frame( "cats" = character(0))
x <- c("16_3_S16_R1_001", "16_3_S16_R2_001", "2_3_S2_R1_001","2_3_S2_R2_001")
df <- data.frame("cats" = x)

数据需要采用正确的结构,在我们的例子中,as.factor()

df$cats <- as.factor(df$cats)
levels(df$cats)[levels(df$cats)=="16_3_S16_R1_001"] <- "16.3R1"
levels(df$cats)[levels(df$cats)=="16_3_S16_R2_001"] <- "16.3R2"
levels(df$cats)[levels(df$cats)=="2_3_S2_R1_001"] <- "2.3R1"
levels(df$cats)[levels(df$cats)=="2_3_S2_R2_001"] <- "2.3R2"

瞧瞧

如果将字符串sample按照模式“_”拆分成子串,则只需要第1、2n、4部分:

sample <- c("16_3_S16_R1_001", 
            "16_3_S16_R2_001",
            "2_3_S2_R1_001",
            "2_3_S2_R2_001")

x <- strsplit(sample, "_")

sapply(x, function(y) paste0(y[1], ".", y[2], y[4]))

您可以使用sub提取部分:

sample <- c("16_3_S16_R1_001","16_3_S16_R2_001","2_3_S2_R1_001","2_3_S2_R2_001")
sub('(\d+)_(\d+)_.*(R\d+).*', '\1.\2\3', sample)
#[1] "16.3R1" "16.3R2" "2.3R1"  "2.3R2" 

\d+指一位或多位数字。 () 之间捕获的值称为捕获组。所以在这里我们捕获一个或多个数字 (1),然后是下划线和另一个数字 (2),最后是带有数字 (3) 的“R”。捕获的值使用反向引用进行引用,因此 \1 是第一个值,\2 是第二个值,依此类推。