【问题标题】:Extract number between underscore in text提取文本中下划线之间的数字
【发布时间】:2018-09-13 17:19:07
【问题描述】:

我的文件的名称类似于

  • Hughson.George_54_4
  • Ifran.Dean_51_3
  • 休斯顿.Amanda_49_6

我想创建一个数据框,其中每一行都是从文件名中提取的信息,格式为作者、卷、期。

我能够提取名称和卷,但似乎无法获得问题编号。使用“stringr”包,我完成了以下操作,这给了我_4 而不仅仅是4

[^a-z](?:[^_]+_){0}([^_ ]+$)  

我该如何解决这个问题?

【问题讨论】:

    标签: r rstudio special-characters stringr


    【解决方案1】:

    您正在寻找:

    read.table(text = string, sep ='_', col.names = c('Author', 'Volume', 'Issue'))
    
              Author Volume Issue
    1 Hughson.George     54     4
    2     Ifran.Dean     51     3
    3 Houston.Amanda     49     6
    

    在哪里

    string <- c("Hughson.George_54_4", "Ifran.Dean_51_3", "Houston.Amanda_49_6")
    

    编辑: 您正在寻找:

     read.table(text = string, sep ='_', fill=TRUE)
    

    【讨论】:

    • 是的,完全一样。只是一开始我必须建立一个语料库,然后需要把它变成一个数据框。
    • 是的,我已经创建了一个。 my.text.location &lt;- "C:/Users/mrina/OneDrive/Documents/Text/Chap 4/EnglishAbstract/" apapers &lt;- VCorpus(DirSource(my.text.location)) papertitles &lt;- unlist(meta(apapers,tag='id')) papertitles
    • 然后用纸片代替字符串并运行代码
    • 试过了,结果出错了。 Error in scan(file = file, what = what, sep = sep, quote = quote, dec = dec, : line 703 did not have 3 elements
    • 这也可以,太棒了!
    【解决方案2】:

    您的正则表达式的[^a-z] 部分与最后一位数字之前的_ 匹配。只需使用一些东西来匹配最后的数字:

    x1 <- c("Hughson.George_54_4", "Ifran.Dean_51_3", "Houston.Amanda_49_6")
    
    str_extract(x1,"([^_]+$)")
    [1] "4" "3" "6"
    
    str_extract(x1,"\\d+$")
    [1] "4" "3" "6"
    

    不过,你的总体目标似乎是 strsplit 的工作:

    data.frame(do.call("rbind",strsplit(sub("\\."," ",x1),"_")))
                  X1 X2 X3
    1 Hughson George 54  4
    2     Ifran Dean 51  3
    3 Houston Amanda 49  6
    

    【讨论】:

    • 这似乎是一种解决方案。谢谢。是的,总体工作只是创建数据框,但我的教授希望我们创建这些对象,例如“作者”、“卷”等,然后使用它们来创建数据框。
    【解决方案3】:

    如果是最后一位,我们可以用base R的方法提取出来

    as.numeric(substring(str1, nchar(str1)))
    

    sub

    as.numeric(sub(".*_", "", str1))
    #[1] 4 3 6
    

    如果我们需要将其拆分为单独的列,一个选项是 separate from tidyverse 这将 split 基于分隔符 (_) 将列分成单独的列,并确保列的类型是converted

    library(tidyverse)
    data_frame(col1 = str1) %>%
        separate(col1, into = c("Author", "Volume", "Issue"), sep = "_", convert = TRUE)
    # A tibble: 3 x 3
    #  Author         Volume Issue
    #  <chr>          <chr>  <chr>
    #1 Hughson.George 54     4    
    #2 Ifran.Dean     51     3    
    #3 Houston.Amanda 49     6    
    

    数据

    str1 <- c("Hughson.George_54_4", "Ifran.Dean_51_3", "Houston.Amanda_49_6")
    

    【讨论】:

    • 您好,所有这些文件都在一个文件夹中,我正在阅读它们,所以大约有 1,303 个文件。 apapers &lt;- VCorpus(DirSource(my.text.location)) class(apapers) summary(apapers) papertitles &lt;- unlist(meta(apapers,tag='id')) papertitles issues &lt;- str_extract_all(papertitles, "[^a-z](?:[^_]+_){0}([^_ ]+$)") 所以它基本上是指“papertitles”
    • @darkpunk 没问题。您可以使用list.files 获取所有文件的名称,即tools::file_path_sans_ext(basename(lis.files()))
    • 哦,阅读不是问题,我们的教授告诉我们有某种方法,我坚持这一点,但会试一试这种方法。它只是这个小问题,我似乎无法弄清楚为什么额外的 _
    • 将尝试使用它并检查。欣赏!
    • 是的,separate 也完成了这项工作。像这样的一件事有很多方法。惊人的帮助!
    猜你喜欢
    • 2013-12-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2020-08-21
    • 2021-05-18
    • 2011-03-06
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多