Answers:
以下是几种方法:
1)子
sub(".*:", "", string)
## [1] "E001" "E002" "E003"
2)分裂
sapply(strsplit(string, ":"), "[", 2)
## [1] "E001" "E002" "E003"
3)读取表
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
返回括号部分:
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)分开
7a)使用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"
图7b)可替换地separate
,可以使用只创建的post
列,然后unlist
和unname
所得到的数据帧:
library(dplyr)
library(tidyr)
DF %>%
separate(string, into = c(NA, "post")) %>%
unlist %>%
unname
## [1] "E001" "E002" "E003"
8)修剪我们可以trimws
用来修剪左边的文字字符,然后再次使用它修剪冒号。
trimws(trimws(string, "left", "\\w"), "left", ":")
## [1] "E001" "E002" "E003"
string
假定输入为:
string <- c("G1:E001", "G2:E002", "G3:E003")
聚会晚了,但是为了后代,stringr包(流行的“ tidyverse”包套件的一部分)现在为函数提供了带有统一签名的函数以处理字符串:
string <- c("G1:E001", "G2:E002", "G3:E003")
# match string to keep
stringr::str_extract(string = string, pattern = "E[0-9]+")
# [1] "E001" "E002" "E003"
# replace leading string with ""
stringr::str_remove(string = string, pattern = "^.*:")
# [1] "E001" "E002" "E003"
如果您使用的data.table
则tstrsplit()
是一个自然的选择:
tstrsplit(string, ":")[[2]]
[1] "E001" "E002" "E003"
该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软件包(v0.3.0)创建于2019-11-06
更多信息:https : //github.com/moodymudskipper/unglue/blob/master/README.md
_
具有分隔符,并根据@Grothendieck答案对前缀和后缀做了两个单独的变量:prefix <- sub("_.*", "", variable)
和suffix <- sub(".*_", "", variable)