假设我有一个字符串列表:string = c("G1:E001", "G2:E002", "G3:E003").现在我希望得到一个字符串向量,它只包含冒号":"之后的部分,即substring = c(E001,E002,E003).在R中有一个方便的方法吗?用substr?谢谢!
G. *_*eck 202
以下是几种方法:
1)子
sub(".*:", "", string)
## [1] "E001" "E002" "E003"
Run Code Online (Sandbox Code Playgroud)
2)strsplit
sapply(strsplit(string, ":"), "[", 2)
## [1] "E001" "E002" "E003"
Run Code Online (Sandbox Code Playgroud)
3)read.table
read.table(text = string, sep = ":", as.is = TRUE)$V2
## [1] "E001" "E002" "E003"
Run Code Online (Sandbox Code Playgroud)
4)子串
这假定第二部分总是从第4个字符开始(问题中的示例中就是这种情况):
substring(string, 4)
## [1] "E001" "E002" "E003"
Run Code Online (Sandbox Code Playgroud)
4a)substring/regex
如果冒号并不总是处于已知位置,我们可以通过搜索来修改(4):
substring(string, regexpr(":", string) + 1)
Run Code Online (Sandbox Code Playgroud)
5)strapplyc
strapplyc 返回带括号的部分:
library(gsubfn)
strapplyc(string, ":(.*)", simplify = TRUE)
## [1] "E001" "E002" "E003"
Run Code Online (Sandbox Code Playgroud)
6)read.dcf
这个只有在冒号之前的子串是唯一的时才有效(它们在问题的例子中).它还要求分隔符是冒号(它在问题中).如果使用了不同的分隔符,那么我们可以先使用sub冒号替换它.例如,如果隔板是_然后string <- sub("_", ":", string)
c(read.dcf(textConnection(string)))
## [1] "E001" "E002" "E003"
Run Code Online (Sandbox Code Playgroud)
添加.tidyr::separate和separate解决方案.
注意.
输入post假定为:
library(dplyr)
library(tidyr)
library(purrr)
DF <- data.frame(string)
DF %>%
separate(string, into = c("pre", "post")) %>%
pull("post")
## [1] "E001" "E002" "E003"
Run Code Online (Sandbox Code Playgroud)
ags*_*udy 23
例如使用gsub或sub
gsub('.*:(.*)','\\1',string)
1] "E001" "E002" "E003"
Run Code Online (Sandbox Code Playgroud)
聚会晚了,但是为了后代,stringr包(流行的“ tidyverse”包套件的一部分)现在为函数提供了带有统一签名的函数以处理字符串:
string <- c("G1:E001", "G2:E002", "G3:E003")
stringr::str_extract(string = string, pattern = "E[0-9]+")
# [1] "E001" "E002" "E003"
Run Code Online (Sandbox Code Playgroud)
如果您正在使用,data.table那么tstrsplit()很自然的选择:
tstrsplit(string, ":")[[2]]
[1] "E001" "E002" "E003"
Run Code Online (Sandbox Code Playgroud)
应该这样做:
gsub("[A-Z][1-9]:", "", string)
Run Code Online (Sandbox Code Playgroud)
给
[1] "E001" "E002" "E003"
Run Code Online (Sandbox Code Playgroud)
该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"
Run Code Online (Sandbox Code Playgroud)
由reprex 包(v0.3.0)于 2019 年 11 月 6 日创建
更多信息:https : //github.com/moodymudskipper/unglue/blob/master/README.md
小智 5
另一种提取子字符串的方法
library(stringr)
substring <- str_extract(string, regex("(?<=:).*"))
#[1] "E001" "E002" "E003
Run Code Online (Sandbox Code Playgroud)
(?<=:):查看冒号后面 ( :)| 归档时间: |
|
| 查看次数: |
207429 次 |
| 最近记录: |