首页
学习
活动
专区
工具
TVP
发布
社区首页 >问答首页 >如何从dataframe中提取最后一个值并删除数字?

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

Stack Overflow用户
提问于 2018-08-01 06:47:55
回答 3查看 60关注 0票数 0

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

代码语言:javascript
复制
 x<-c("WB (16)","CT (14)WB (15)","NBIO (15)","CT (12)CITG-TP (17)","BK (11)PS (15)BK-AR (15)")

看起来像这样

代码语言:javascript
复制
 x<-
    WB
    WB
    NBIO
    CITG-TP
    BK-AR

所以我想提取最后一个或唯一的值(这是一个单词和它的年份,所以例如。WB(15)是一个值),然后去掉带有括号的年份。我尝试过使用sub(".*?)", "", x)执行此操作,但当只有一个条目时,它也会将其清除,如下所示:

代码语言:javascript
复制
c( "", "WB (15)" , "" , "CITG-TP (17)","PS (15)BK-AR (15)")

我该怎么做呢?

EN

回答 3

Stack Overflow用户

回答已采纳

发布于 2018-08-01 10:07:28

代码语言:javascript
复制
 sub(".*?([^)]+)\\s\\(\\d+\\)$","\\1",x)
[1] "WB"      "WB"      "NBIO"    "CITG-TP" "BK-AR"  
票数 1
EN

Stack Overflow用户

发布于 2018-08-01 07:30:55

这将删除引号之间的数字,并选择每个字符串中的最后一个代码。我使用管道(%>%)来保持代码的整洁。

代码语言:javascript
复制
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"  
票数 2
EN

Stack Overflow用户

发布于 2018-08-01 07:42:53

我强烈怀疑这是最有效的正则表达式,但这会得到您想要的确切输出:

代码语言:javascript
复制
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" 

我玩了更多,这看起来也行得通。

代码语言:javascript
复制
str_replace_all(x, "\\s\\(\\d+\\)|CT|PS|BK(?=\\s)","")
[1] "WB"      "WB"      "NBIO"    "CITG-TP" "BK-AR" 

下面是一种更通用的方法

代码语言:javascript
复制
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" 

我想可能有一些方法可以选择最后一个出现的模式,但我在这方面遇到了一些问题,所以我定义了一个函数来反转字符串,并获取第一个出现的模式,然后我们只需将字符串放回正确的顺序。

票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/51623141

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档