【问题标题】:Extracting list data from text file in R从R中的文本文件中提取列表数据
【发布时间】:2018-07-11 18:45:59
【问题描述】:

可能已经有一篇关于此主题的帖子,但我不确定要搜索哪些字词。我正在尝试从具有这种格式的 txt 文件中导入数据(前两行不感兴趣):

FN Clarivate Analytics Web of Science
VR 1.0
PT J
AU Ahituv, Nadav
   Zhu, Yiwen
   Visel, Axel
   Holt, Amy
   Afzal, Veena
   Pennacchio, Len A.
   Rubin, Edward M.
TI Deletion of ultraconserved elements yields viable mice
SO PLOS BIOLOGY
VL 5
IS 9
BP 1906
EP 1911
AR e234
DI 10.1371/journal.pbio.0050234
PD SEP 2007
PY 2007
RI Visel, Axel/A-9398-2009; Ahituv, Nadav/; Pennacchio, Len/
OI Visel, Axel/0000-0002-4130-7784; Ahituv, Nadav/0000-0002-7434-8144;
   Pennacchio, Len/0000-0002-8748-3732
SN 1544-9173
UT WOS:000249552300010
PM 17803355
ER

PT J
AU Ahmadiyeh, Nasim
   Pomerantz, Mark M.
   Grisanzio, Chiara
   Herman, Paula
   Jia, Li
   Almendro, Vanessa
   He, Housheng Hansen
   Brown, Myles
   Liu, X. Shirley
   Davis, Matt
   Caswell, Jennifer L.
   Beckwith, Christine A.
   Hills, Adam
   MacConaill, Laura
   Coetzee, Gerhard A.
   Regan, Meredith M.
   Freedman, Matthew L.
TI 8q24 prostate, breast, and colon cancer risk loci show tissue-specific
   long-range interaction with MYC
SO PROCEEDINGS OF THE NATIONAL ACADEMY OF SCIENCES OF THE UNITED STATES OF
   AMERICA
VL 107
IS 21
BP 9742
EP 9746
DI 10.1073/pnas.0910668107
PD MAY 25 2010
PY 2010
RI Davis, Matt/F-9045-2012; He, Housheng/G-9614-2011; he, housheng hansen/; Caswell-Jin, Jennifer/; Brown, Myles/
OI he, housheng hansen/0000-0003-2898-3363; Caswell-Jin,
   Jennifer/0000-0002-5711-8355; Brown, Myles/0000-0002-8213-1658
SN 0027-8424
UT WOS:000278054700049
PM 20453196
ER

由于某些类别(例如 AU)有多个对象,我想我需要作为列表导入。类别标签都是 2 个字符后跟一个空格,但有些类别不止一行,后续行没有使用类别标签进行标注。另外,对于一些占用多于一行的类别,比如AU,我希望将数据作为向量导入。对于其他人,例如 TI 或 SO,我想将多行连接到列表中 character 类的一个对象中。

我希望条目看起来像这样:

print(<portion of list that corresponds to AU for first reference>)
[AU]
[[1]] "Ahituv, Nadav"      "Zhu, Yiwen"         "Visel, Axel"        "Holt, Amy"          "Afzal, Veena"      
[[6]] "Pennacchio, Len A." "Rubin, Edward M."

print(<portion of lilst that corresponds to TI and SO for second reference>)
[TI]
[[1]] "8q24 prostate, breast, and colon cancer risk loci show tissue-specific long-range interaction with MYC"
[SO]
[[1]] "PROCEEDINGS OF THE NATIONAL ACADEMY OF SCIENCES OF THE UNITED STATES OF AMERICA"

我尝试使用scan() 使用以下代码:

scan("savedrecs_spitz refs.txt", what = "character", sep = "\n")

但是,读入的是单个字符向量,其中 txt 的每一行都作为向量中的一个单独对象读入:

[1] "FN Clarivate Analytics Web of Science" "VR 1.0"                                  
[3] "PT J"                                     "AU Ahituv, Nadav"                        
[5] "   Zhu, Yiwen"                            "   Visel, Axel"

我应该使用不同的函数来读取这些数据吗?

【问题讨论】:

  • “我应该使用不同的函数来读取这些数据吗?” 是的,有,readLines。现在说真的,您需要进行一些处理才能使所有“AU”成为一个向量。另外,我不明白你想对其他人做什么,比如“TI”或“SO”。
  • @Rui Barradas,我添加了一个我想要的输出示例。谢谢。
  • 这看起来很像 Medline 格式的引文。应该考虑 Pubmed/Medline 软件包。
  • @42,这些是 Medline 引文。我会谷歌包来阅读它们。有没有你幸运的包裹?谢谢。
  • 您可以考虑搜索:"[r] pubmed"。我有 130 次点击。

标签: r list import


【解决方案1】:

这就是你要找的吗?

dt=scan("savedrecs_spitz refs.txt", what = "character", sep = "\n")

mgrep=function(dt){
  v=intersect(grep("[A-Z]{2}",dt),which(nchar(dt)==2))
  ret=list()
  for(i in 1:length(v)){
    end=ifelse(i==length(v),length(dt),(v[i+1]-1))
    st=(v[i]+1)
    ret[[i]]=dt[st:end]
  }
  names(ret)=dt[v]
  return(ret)
}
mgrep(dt)

ps:注意特殊字符被错误读取,如“FN”,在函数内部无法正确使用。

【讨论】:

    【解决方案2】:

    我认为我已经解决了你的问题,但我将数据保存在 data.frame 中

    library(stringr)
    
    text <- scan("text.txt",sep = "\n",what = "character")
    
    textLoop <- grep("^[[:upper:]]|^[[:blank:]]", text, value = TRUE)
    
    for(i in 1:length(textLoop)){
      if(grepl("^[[:blank:]]", textLoop[i])){
        partOne <- substring(textLoop[i-1], 1, 2)
        textLoop[i] <- paste0(partOne, textLoop[i])
      }
    }
    
    textDf <- data.frame(partOne = substring(textLoop, 1, 2),
                         partTwo = substring(textLoop, 4))
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2022-01-22
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2020-12-20
      相关资源
      最近更新 更多