我有一个字符串向量,看起来像这样:
string
。ABC_EFG_HIG_ADF_AKF_MNB
现在我想从每个元素中提取第3组字符串(从左开始),即在此示例中为HIG。我如何在R中实现这一点?
substr
按位置提取子字符串:
substr('ABC_EFG_HIG_ADF_AKF_MNB', 9, 11)
返回
[1] "HIG"
strsplit(str1,"_")[[1]][3]
#[1] "HIG"
strsplit()
做了它的名字所示的事情:它分割字符串。第二个参数是字符串被分割的字符,无论它在字符串中的位置在哪里。strsplit()
返回一个列表。因此,我们可以使用unlist()
来访问原始字符串的分割结果,或者在这种情况下,用列表索引[[1]]
地址它们,因为这个例子中的列表只有一个成员,它由六个字符字符串组成(参见str(strsplit(str1,"_"))
的输出)。
要访问此列表的第三个条目,我们可以在命令的末尾指定[3]
。str1
在这里像@akrun的答案中定义。sub
。我们匹配一个或多个非_
字符([^_]+
),然后是一个_
。将它保留在一个捕获组中。由于我们想要提取第三组非_
字符,因此我们重复之前括起来的组两次({2}_
字符,以及由.*
指示的其余字符。在替换中,我们使用第二个捕获组的反向引用(\\2
)。sub("^([^_]+_){2}([^_]+).*", "\\2", str1)
#[1] "HIG"
另一种选择是使用 scan
scan(text=str1, sep="_", what="", quiet=TRUE)[3]
#[1] "HIG"
@RHertel提到的类似选项是在字符串上使用read.table/read.csv
read.table(text=str1,sep = "_", stringsAsFactors=FALSE)[,3]
str1 <- "ABC_EFG_HIG_ADF_AKF_MNB"
如果您知道要查找的模式的位置,并且知道它是固定的(在这里,介于第9个字符和第11个字符之间),则可以简单地使用stringr包中的str_sub()函数。
MyString = 'ABC_EFG_HIG_ADF_AKF_MNB'
str_sub(MyString, 9, 11)
一种新的选项是使用开发版本stringr中的函数str_split_i
,它也可以通过位置拆分由某个字符串分隔的字符串。以下是一个可重现的示例:
# devtools::install_github("tidyverse/stringr")
library(stringr)
x <- c("ABC_EFG_HIG_ADF_AKF_MNB")
str_split_i(x, "_", 3)
#> [1] "HIG"
创建日期为2022年9月10日,使用reprex v2.0.2
从结果中可以看到它提取了第三个字符串。如果你想要第六个字符串,可以像这样将3改成6:
library(stringr)
x <- c("ABC_EFG_HIG_ADF_AKF_MNB")
str_split_i(x, "_", 6)
#> [1] "MNB"
使用 reprex v2.0.2 创建于2022年9月10日。
strsplit(str1,"_")[[c(1,3)]]
,只是为了展示向量在[[
内部的作用。 - nicola