假设我有一个字符串列表:string = c("G1:E001", "G2:E002", "G3:E003")
。现在我希望得到一个字符串向量,它只包含冒号“:”之后的部分,即substring = c(E001,E002,E003)
。在R中有一个方便的方法吗?使用substr
?谢谢!
答案 0 :(得分:169)
以下是一些方法:
1)sub
sub(".*:", "", string)
## [1] "E001" "E002" "E003"
2)strsplit
sapply(strsplit(string, ":"), "[", 2)
## [1] "E001" "E002" "E003"
3)read.table
read.table(text = string, sep = ":", as.is = TRUE)$V2
## [1] "E001" "E002" "E003"
4)子串
这假定第二部分总是从第4个字符开始(问题中的例子就是这种情况):
substring(string, 4)
## [1] "E001" "E002" "E003"
4a)substring / regex
如果冒号并非总是处于已知位置,我们可以通过搜索来修改(4):
substring(string, regexpr(":", string) + 1)
5)strapplyc
strapplyc
返回带括号的部分:
library(gsubfn)
strapplyc(string, ":(.*)", simplify = TRUE)
## [1] "E001" "E002" "E003"
6)read.dcf
这个只有在冒号之前的子串是唯一的(它们在问题中的示例中)才有效。它还要求分隔符是冒号(它在问题中)。如果使用了不同的分隔符,那么我们可以先使用sub
替换冒号。例如,如果分隔符为_
,则为string <- sub("_", ":", string)
c(read.dcf(textConnection(string)))
## [1] "E001" "E002" "E003"
溶液。 strapplyc
和read.dcf
解决方案。
请注意
输入string
假定为:
string <- c("G1:E001", "G2:E002", "G3:E003")
答案 1 :(得分:22)
例如,使用gsub
或sub
gsub('.*:(.*)','\\1',string)
1] "E001" "E002" "E003"
答案 2 :(得分:9)
这是另一个简单的答案
gsub("^.*:","", string)
答案 3 :(得分:4)
这应该做:
gsub("[A-Z][1-9]:", "", string)
给出
[1] "E001" "E002" "E003"
答案 4 :(得分:4)
晚了聚会,但为了后代, stringr 软件包(流行的“ tidyverse”软件包套件的一部分)现在为函数提供了带有统一签名的函数,用于字符串处理:
string <- c("G1:E001", "G2:E002", "G3:E003")
stringr::str_extract(string = string, pattern = "E[0-9]+")
# [1] "E001" "E002" "E003"
答案 5 :(得分:2)
提取子字符串的另一种方法
library(stringr)
substring <- str_extract(string, regex("(?<=:).*"))
#[1] "E001" "E002" "E003
(?<=:)
:在冒号(:
)后面答案 6 :(得分:1)
如果您使用的是data.table
,那么tstrsplit()
是很自然的选择:
tstrsplit(string, ":")[[2]]
[1] "E001" "E002" "E003"
答案 7 :(得分:0)
unglue 软件包提供了一种替代方法,对于简单的情况,不需要有关正则表达式的知识,我们可以这样做:
# install.packages("unglue")
library(unglue)
string = c("G1:E001", "G2:E002", "G3:E003")
unglue_vec(string,"{x}:{y}", var = "y")
#> [1] "E001" "E002" "E003"
由reprex package(v0.3.0)于2019-11-06创建
更多信息:https://github.com/moodymudskipper/unglue/blob/master/README.md
答案 8 :(得分:0)
令人惊讶的是,尚未添加非常“基础的 R”解决方案:
string = c("G1:E001", "G2:E002", "G3:E003")
regmatches(string, regexpr('E[0-9]+', string))