使用 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
是第二个值,依此类推。
我有一列数据框,其中有数千个像这样的复杂样本名称
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
是第二个值,依此类推。