您的要求有点不清楚,但看起来您只想保留第三个下划线之前的块。如果是这样,您可以使用正则表达式来解决这个问题。正则表达式
str_extract(input_string, "^(([^_])+_){3}")
将取出以下划线结尾的前 3 个字符块(不是下划线)。第一个 ^ "anchors" 匹配到字符串的开头,"[^_]+_" 匹配下划线之前的任意数量的非下划线字符。 {3} 执行上述操作 3 次。
因此,对于“Pbs_d7_s2_juliam_08July2020_02_1_0_live singlets.fcs”,您最终会得到“Pbs_d7_s2_”。现在你只需像这样用“.fcs”替换最后一个下划线
str_replace(modified string, "_$", ".fcs")
$“锚”它前面的字符到字符串的末尾,所以在这种情况下,它会替换最后一个下划线。完整的序列是
string1<- "Pbs_d7_s2_juliam_08July2020_02_1_0_live singlets.fcs"
str_extract(string1, "^(([^_])+_){3}") %>%
str_replace("_$",".fcs")
[1] "Pbs_d7_s2.fcs"
现在让我们假设您的文件名在一个名为 stringvec 的向量中。
output <- vector("character",length(stringvec))
for (i in seq_along(stringvec)) {
output[[i]] <- str_extract(stringvec[[i]],"^(([^_])+_){3}")%>%
str_replace("_$",".fcs")
}
output
我在这里做了一些假设 - 即所有文件的命名约定都是相同的。如果不是这样,您将需要找到修改正则表达式搜索模式的方法。
我推荐这个答案How do I rename files using R? 来替换文件名的向量。如果您有原始文件名的向量,您可以使用我的 for 循环生成新名称的向量,然后您可以使用链接中的信息将一个替换为另一个。也许还有其他不涉及 for 循环的解决方案。