假设我有一个字符串的列表。string = c("G1:E001", "G2:E002", "G3:E003")
。现在我希望得到一个只包含冒号":"之后部分的字符串向量,即substring = c(E001,E002,E003)
。在R中是否有一个方便的方法来做到这一点?使用substr
?谢谢!
这里有几个方法。
1)分
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) 子串/楔形文字
如果冒号不总是在已知的位置,我们可以通过搜索来修改(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"
7) separate 使用tidyr::separate
我们创建一个有两列的数据框,一列是冒号之前的部分,一列是冒号之后的部分,然后提取后者。
library(dplyr)
library(tidyr)
library(purrr)
DF <- data.frame(string)
DF %>%
separate(string, into = c("pre", "post")) %>%
pull("post")
## [1] "E001" "E002" "E003"
7a)也可以用separate
来直接创建post
列,然后将生成的数据框unlist
和unname
。
library(dplyr)
library(tidyr)
DF %>%
separate(string, into = c(NA, "post")) %>%
unlist %>%
unname
## [1] "E001" "E002" "E003"
增加了。strapplyc
, read.dcf
和separate
的解决方案。
注意。
输入的 "字符串 "被假定为。
string <- c("G1:E001", "G2:E002", "G3:E003")