嗨,您的数据包含两个或多个点。我的要求是从第一个点到第二个点获取字符串。
例如string <- "abcd.vdgd.dhdsg"
结果expected =vdgd
我用过
pt <-strapply(string, "\\.(.*)\\.", simplify = TRUE)
给出正确的数据,但是对于具有两个以上点的字符串,它无法正常工作。
例如string <- "abcd.vdgd.dhdsg.jsgs"
其给定dhdsg.jsgs
,但预期为vdgd
有人可以帮我吗?
感谢与问候,
答案 0 :(得分:4)
在基数R中,我们可以使用strsplit
ss <- "abcd.vdgd.dhdsg"
unlist(strsplit(ss, "\\."))[2]
#[1] "vdgd"
或将gregexpr
与regmatches
一起使用
unlist(regmatches(ss, gregexpr("[^\\.]+", ss)))[2]
#[1] "vdgd"
或使用gsub
(感谢@TCZhang)
gsub("^.+?\\.(.+?)\\..*$", "\\1", ss)
#[1] "vdgd"
答案 1 :(得分:2)
带有qdapRegex
软件包的另一种解决方案:
library(qdapRegex)
ex_between("abcd.vdgd.dhdsg.jsgs", ".", ".")[[1]][1]
# "vdgd"
答案 2 :(得分:2)
另一个选择:
string <- "abcd.vdgd.dhdsg.jsgs"
library(stringr)
str_extract(string = string, pattern = "(?<=\\.).*?(?=\\.)")
[1] "vdgd"
我喜欢这个,因为str_extract
函数将返回正确模式的第一个实例,但是您也可以使用str_extract_all
来获取所有实例。
str_extract_all(string = string, pattern = "(?<=\\.).*?(?=\\.)")
[[1]]
[1] "vdgd" "dhdsg"
从这里,您可以索引以获取想要的两个点之间的任何位置。
答案 3 :(得分:1)
如果愿意,也可以使用read.table
。此处提供问题中给出的字符串,并将分隔符选择为dot(“。”),将列转换为data.frame之后,可以选择选择要选择的任何列(在这种情况下,该列为第2列)。
read.table(text=string, sep=".",stringsAsFactors = FALSE)[,2]
输出:
> read.table(text=string, sep=".",stringsAsFactors = FALSE)[,2]
[1] "vdgd"
答案 4 :(得分:1)
这是通过stringr
stringr::word(string, 2, sep = '\\.')
答案 5 :(得分:1)
以下是在输入字符串向量上向量化的两个选项:
tstrsplit
上进行矢量化处理的data.table
中的string
:> string <- c("abcd.vdgd.dhdsg", "abcd.vdgd.dhdsg.jsgs") > tstrsplit(string, '.', fixed = TRUE)[[2]] [1] "vdgd" "vdgd"
> sub('.*?\\.(.*?)\\..*', '\\1', string) [1] "vdgd" "vdgd"`