如何从数据框中提取最后一个值并删除数字?
how to extract last values from dataframe and remove numbers?
所以我想要这个dataframe/string/vector
x<-c("WB (16)","CT (14)WB (15)","NBIO (15)","CT (12)CITG-TP (17)","BK (11)PS (15)BK-AR (15)")
看起来像这样
x<-
WB
WB
NBIO
CITG-TP
BK-AR
所以我想提取最后一个或唯一的值(这是一个词连同它的年份所以例如 WB(15) 是一个值)然后用括号删除年份。我尝试用 sub(".*?)", "", x)
这样做,但是当只有一个条目时,它也会清除它,如下所示:
c( "", "WB (15)" , "" , "CITG-TP (17)","PS (15)BK-AR (15)")
我该怎么做?
这将删除引号和它们之间的数字 select 每个字符串中的最后一个代码。我正在使用管道 (%>%
) 让代码更清晰。
library(magrittr) # pipe operators
newx <-
x %>%
gsub('[[:blank:]]\([[:digit:]]*\)', ';', .) %>% # change all " (NN)" to ";"
strsplit(split = ';') %>% # split the strings into a list
lapply(rev) %>% # revert the order
lapply('[[', 1) %>% # select first element
unlist() # change back to vector
> newx
[1] "WB" "WB" "NBIO" "CITG-TP" "BK-AR"
我强烈怀疑这是最有效的正则表达式,但这可以为您提供所需的确切输出:
library(stringr)
str_replace_all(x, "CT\s\(\d+\)|BK\s\(\d+\)|PS\s\(\d+\)|\s\(\d+\)","")
[1] "WB" "WB" "NBIO" "CITG-TP" "BK-AR"
我又玩了一些,这看起来也行。
str_replace_all(x, "\s\(\d+\)|CT|PS|BK(?=\s)","")
[1] "WB" "WB" "NBIO" "CITG-TP" "BK-AR"
这是一个更通用的方法
strReverse <- function(x){
sapply(lapply(strsplit(x, NULL), rev), paste, collapse="")
}
strReverse(str_extract(strReverse(x),"(?<=\(\s).*?(?=(\)|$))"))
[1] "WB" "WB" "NBIO" "CITG-TP" "BK-AR"
我可能有某种方法可以 select 最后一次出现的模式,但我遇到了一些麻烦,所以我定义了一个函数来反转字符串并取第一次出现的pattern 然后我们将字符串放回正确的顺序。
sub(".*?([^)]+)\s\(\d+\)$","\1",x)
[1] "WB" "WB" "NBIO" "CITG-TP" "BK-AR"
所以我想要这个dataframe/string/vector
x<-c("WB (16)","CT (14)WB (15)","NBIO (15)","CT (12)CITG-TP (17)","BK (11)PS (15)BK-AR (15)")
看起来像这样
x<-
WB
WB
NBIO
CITG-TP
BK-AR
所以我想提取最后一个或唯一的值(这是一个词连同它的年份所以例如 WB(15) 是一个值)然后用括号删除年份。我尝试用 sub(".*?)", "", x)
这样做,但是当只有一个条目时,它也会清除它,如下所示:
c( "", "WB (15)" , "" , "CITG-TP (17)","PS (15)BK-AR (15)")
我该怎么做?
这将删除引号和它们之间的数字 select 每个字符串中的最后一个代码。我正在使用管道 (%>%
) 让代码更清晰。
library(magrittr) # pipe operators
newx <-
x %>%
gsub('[[:blank:]]\([[:digit:]]*\)', ';', .) %>% # change all " (NN)" to ";"
strsplit(split = ';') %>% # split the strings into a list
lapply(rev) %>% # revert the order
lapply('[[', 1) %>% # select first element
unlist() # change back to vector
> newx
[1] "WB" "WB" "NBIO" "CITG-TP" "BK-AR"
我强烈怀疑这是最有效的正则表达式,但这可以为您提供所需的确切输出:
library(stringr)
str_replace_all(x, "CT\s\(\d+\)|BK\s\(\d+\)|PS\s\(\d+\)|\s\(\d+\)","")
[1] "WB" "WB" "NBIO" "CITG-TP" "BK-AR"
我又玩了一些,这看起来也行。
str_replace_all(x, "\s\(\d+\)|CT|PS|BK(?=\s)","")
[1] "WB" "WB" "NBIO" "CITG-TP" "BK-AR"
这是一个更通用的方法
strReverse <- function(x){
sapply(lapply(strsplit(x, NULL), rev), paste, collapse="")
}
strReverse(str_extract(strReverse(x),"(?<=\(\s).*?(?=(\)|$))"))
[1] "WB" "WB" "NBIO" "CITG-TP" "BK-AR"
我可能有某种方法可以 select 最后一次出现的模式,但我遇到了一些麻烦,所以我定义了一个函数来反转字符串并取第一次出现的pattern 然后我们将字符串放回正确的顺序。
sub(".*?([^)]+)\s\(\d+\)$","\1",x)
[1] "WB" "WB" "NBIO" "CITG-TP" "BK-AR"