如何从数据框中提取最后一个值并删除数字?

时间:2018-07-31 22:47:55

标签: r regex dataframe substring gsub

所以我想要这个数据框/字符串/向量

 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)")

我该怎么做?

3 个答案:

答案 0 :(得分:2)

这将删除引号之间的数字,并且它们选择每个字符串中的最后一个代码。我正在使用管道(%>%)来使代码更干净。

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"  

答案 1 :(得分:1)

我强烈怀疑这是最有效的正则表达式,但这可以为您提供所需的确切输出:

null

我玩过的游戏更多,而且看起来也可以。

None

这是一种更通用的方法

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" 

我可能有某种方法可以选择模式的最后一次出现,但是我遇到了麻烦,所以我定义了一个函数来反转字符串并采用模式的第一次出现,然后我们将字符串以正确的顺序返回。

答案 2 :(得分:1)

TextIOWrapper