在R语言中如何通过位置提取字符串的一部分

12
我有一个字符串向量,看起来像这样:

string


ABC_EFG_HIG_ADF_AKF_MNB

现在我想从每个元素中提取第3组字符串(从左开始),即在此示例中为HIG。我如何在R中实现这一点?

5个回答

19

substr按位置提取子字符串:

substr('ABC_EFG_HIG_ADF_AKF_MNB', 9, 11)

返回

[1] "HIG"

10
这里有另一种可能性:
strsplit(str1,"_")[[1]][3]
#[1] "HIG"

命令strsplit()做了它的名字所示的事情:它分割字符串。第二个参数是字符串被分割的字符,无论它在字符串中的位置在哪里。
也许有点令人惊讶的是,strsplit()返回一个列表。因此,我们可以使用unlist()来访问原始字符串的分割结果,或者在这种情况下,用列表索引[[1]]地址它们,因为这个例子中的列表只有一个成员,它由六个字符字符串组成(参见str(strsplit(str1,"_"))的输出)。 要访问此列表的第三个条目,我们可以在命令的末尾指定[3]
字符串str1在这里像@akrun的答案中定义。

1
本来也想发同样的内容,但略有不同:strsplit(str1,"_")[[c(1,3)]],只是为了展示向量在[[内部的作用。 - nicola

7
我们可以使用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"

6

如果您知道要查找的模式的位置,并且知道它是固定的(在这里,介于第9个字符和第11个字符之间),则可以简单地使用stringr包中的str_sub()函数。

MyString = 'ABC_EFG_HIG_ADF_AKF_MNB'
str_sub(MyString, 9, 11)

2

一种新的选项是使用开发版本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日。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接