我有一个字符串字符串矢量,看起来像这样
ABC_EFG_HIG_ADF_AKF_MNB
现在从这个元素的每一个我想提取第三组字符串(从左边),即在这种情况下HIG。我怎样才能在R
中实现这一目标答案 0 :(得分:8)
这是另一种可能性:
strsplit(str1,"_")[[1]][3]
#[1] "HIG"
命令strsplit()
的名字就是它的名字:它会分割一个字符串。第二个参数是字符串被分割的字符,无论它在字符串中的哪个位置。
或许有点令人惊讶的是,strsplit()
会返回一个列表。因此,我们可以使用unlist()
来访问原始字符串的结果分割部分,或者在这种情况下使用列表[[1]]
的索引来解决它们,因为此示例中的列表只有一个成员,由六个字符串组成(参见str(strsplit(str1,"_"))
的输出)。
要访问此列表的第三个条目,我们可以在命令末尾指定[3]
。
字符串str1
在此处定义为@akrun的答案。
答案 1 :(得分:5)
我们可以使用sub
。我们匹配的一个或多个字符不是_
([^_]+
),后跟_
。将其保存在捕获组中。由于我们想要提取第三组非_
字符,我们重复先前包含的组2次({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"
答案 2 :(得分:4)
substr
按位置提取子字符串:
substr('ABC_EFG_HIG_ADF_AKF_MNB', 9, 11)
返回
[1] "HIG"
答案 3 :(得分:2)
如果您知道要查找的模式的位置,并且知道它是固定的(这里介于9和11个字符之间),则可以从stringr包中简单地使用str_sub()。
MyString = 'ABC_EFG_HIG_ADF_AKF_MNB'
str_sub(MyString, 9, 11)