【问题标题】:how to extract last values from dataframe and remove numbers?如何从数据框中提取最后一个值并删除数字?
【发布时间】:2018-07-31 22:47:54
【问题描述】:

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

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

我该怎么做?

【问题讨论】:

  • 发布一个可重现的例子;您发布的不是 data.frame。
  • 这样好吗?
  • 检查示例中的逗号

标签: r regex dataframe substring gsub


【解决方案1】:

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

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"  

【讨论】:

  • 不,这不是我的意思,因为某些 valies 必须被排除在外,例如 [2],即 "CT (14)WB (15)" -> "WB" 所以 CT 应该消失
  • 抱歉,我以为您输入的示例有误。我更新了答案以使用任何代码和任何重复次数。
【解决方案2】:
 sub(".*?([^)]+)\\s\\(\\d+\\)$","\\1",x)
[1] "WB"      "WB"      "NBIO"    "CITG-TP" "BK-AR"  

【讨论】:

    【解决方案3】:

    我强烈怀疑这是最有效的正则表达式,但这会为您提供您正在寻找的确切输出:

    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" 
    

    我可能有一些方法可以选择模式的最后一次出现,但我遇到了一些麻烦,所以我定义了一个函数来反转字符串并获取模式的第一次出现,然后我们只是把字符串以正确的顺序排列。

    【讨论】:

    • 它适用于示例,但是我得到了更多不同类型的值,例如BK (07)CT (09),因此它们仍然转换为""。你能把它说得更笼统吗?
    • 让我看看我能做什么。我有另一个想法。
    猜你喜欢
    • 1970-01-01
    • 2017-08-18
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2022-12-12
    • 1970-01-01
    • 2014-08-19
    相关资源
    最近更新 更多