R 提取字符串中名称的某些部分

R 提取字符串中名称的某些部分,r,R,我试图在DF DF a b a.b.c_tot 1 b.c.d_tot 2 d.e.g_tot 3 我需要提取和\u tot之间的字母,以便 DF a b c a.b.c_tot 1 c b.c.d_tot 2 d d.e.g_tot 3 g 我想可以用sub完成,就像我今天学到的那样,如何在第一个之前提取字母,但是如何提取名称的“中间”部分呢? 我正在阅读sub解释和帮助,但我所有的试验结果都只是将a的全名复

我试图在
DF

DF
a           b
a.b.c_tot   1
b.c.d_tot   2
d.e.g_tot   3
我需要提取
\u tot
之间的字母,以便

DF
a           b   c
a.b.c_tot   1   c
b.c.d_tot   2   d 
d.e.g_tot   3   g
我想可以用
sub
完成,就像我今天学到的那样,如何在第一个
之前提取字母,但是如何提取名称的“中间”部分呢? 我正在阅读
sub
解释和帮助,但我所有的试验结果都只是将
a
的全名复制到
c
。 感谢您提供的提示。

我们可以调用
sub()
来匹配整个字符串,从(1)任意数量的字符开始,然后(2)一个文字点,然后(3)使用捕获组捕获以下字符,然后(4)一个文字
\u tot
。然后,我们可以使用
\1
反引用原子(根据R的字符串编码规则正确地转义反斜杠)将整个字符串替换为捕获的字符

DF$c <- sub('^.*\\.(.)_tot$','\\1',DF$a);
DF;
##           a b c
## 1 a.b.c_tot 1 c
## 2 b.c.d_tot 2 d
## 3 d.e.g_tot 3 g
这里有一个更好的解决方案,包括预先将正则表达式存储在变量中,并在调用
sub()
之前使用
grepl()
replace()
将不匹配的值替换为NA:


re将
regexpr
regmatches
与lookback和lookahead正则表达式一起使用

x <- c("a.b.c_tot", "b.c.d_tot", "d.e.g_tot")
regmatches(x, regexpr("(?<=\\.).(?=_tot)", x, perl = TRUE))
#[1] "c" "d" "g"

x我们可以使用
stru-extract

library(stringr)
DF$c <- str_extract(DF$a, "\\w(?=_tot)")
DF$c
#[1] "c" "d" "g"
库(stringr)

DF$c如果您想提取该字母,可以使用
substring()
函数。谢谢,substring()完成了这项工作!而且似乎比sub容易得多:)不幸的是,它还返回了我的全名。
x <- c("a.b.c_tot", "b.c.d_tot", "d.e.g_tot")
regmatches(x, regexpr("(?<=\\.).(?=_tot)", x, perl = TRUE))
#[1] "c" "d" "g"
library(stringr)
DF$c <- str_extract(DF$a, "\\w(?=_tot)")
DF$c
#[1] "c" "d" "g"