我想保留FIRST非核心后的部分。请参阅示例代码。
colnames(df)
"EGAR00001341740_P32_1" "EGAR00001341741_PN32"
我的尝试,但没有给P32_1
但只有P32
这是错误的。
sapply(strsplit(colnames(df), split='_', fixed=TRUE), function(x) (x[2]))
所需的输出:P32_1, PN32
答案 0 :(得分:2)
可以通过匹配字符串的开头([^_]*
)中不是下划线(^
)的零个或多个字符,后跟下划线({{1)来使用正则表达式来完成}}并用空格(_
)
""
使用colnames(df) <- sub("^[^_]*_", "", colnames(df))
colnames(df)
#[1] "P32_1" "PN32"
,它会在strsplit
字符出现时分割。一个选项是来自split
的{{1}},其中有一个选项可以指定'n',即分割部分的数量。如果我们选择str_split
,我们会得到2个子字符串,因为它只会在第一个stringr
n = 2
答案 1 :(得分:2)
以下是一些方法。第一个修复问题中的代码,剩下的代码是替代方案。除了(6)以外,全部只使用基数。 (4)和(7)假设第一个字段是固定长度,这就是问题中的情况。
x <- c("EGAR00001341740_P32_1", "EGAR00001341741_PN32")
# 1 - using strsplit
sapply(strsplit(x, "_"), function(x) paste(x[-1], collapse = "-"))
## [1] "P32_1" "PN32"
# 2 - a bit easier using sub. *? is a non-greedy match
sub(".*?_", "", x)
## [1] "P32_1" "PN32"
# 3 - locate the first underscore and extract all after that
substring(x, regexpr("_", x) + 1)
## [1] "P32_1" "PN32"
# 4 - if the first field is fixed length as in the example
substring(x, 17)
## [1] "P32_1" "PN32"
# 5 - replace first _ with character that does not appear and remove all until it
sub(".*;", "", sub("_", ";", x))
## [1] "P32_1" "PN32"
# 6 - extract everything after first _
library(gsubfn)
strapplyc(x, "_(.*)", simplify = TRUE)
## [1] "P32_1" "PN32"
# 7 - like (4) assumes fixed length first field
read.fwf(textConnection(x), widths = c(16, 99), as.is = TRUE)$V2
## [1] "P32_1" "PN32"