【问题标题】:What is the best way to parse this flat text format in R?在 R 中解析这种平面文本格式的最佳方法是什么?
【发布时间】:2013-04-08 04:00:52
【问题描述】:
1. ZFP112
Official Symbol: ZFP112 and Name: zinc finger protein 112 homolog (mouse)[Homo sapiens]
Other Aliases: ZNF112, ZNF228
Other Designations: zfp-112; zinc finger protein 112; zinc finger protein 228
Chromosome: 19; Location: 19q13.2
Annotation: Chromosome 19NC_000019.9 (44830706..44860856, complement)
ID: 7771

2. SEP15
15 kDa selenoprotein[Homo sapiens]
Chromosome: 1; Location: 1p31
Annotation: Chromosome 1NC_000001.10 (87328128..87380107, complement)
MIM: 606254
ID: 9403

3. MLL4
myeloid/lymphoid or mixed-lineage leukemia 4[Homo sapiens]
Other Aliases: HRX2, KMT2B, MLL2, TRX2, WBP7
Other Designations: KMT2D; WBP-7; WW domain binding protein 7; WW domain-binding protein 7; histone-lysine N-methyltransferase MLL4; lysine N-methyltransferase 2B; lysine N-methyltransferase 2D; mixed lineage leukemia gene homolog 2; myeloid/lymphoid or mixed-lineage leukemia protein 4; trithorax homolog 2; trithorax homologue 2
Chromosome: 19; Location: 19q13.1
Annotation: Chromosome 19NC_000019.9 (36208921..36229779)
MIM: 606834
ID: 9757

37. LOC100509547
hypothetical protein LOC100509547[Homo sapiens]
This record was discontinued.
ID: 100509547

43. LOC100509587
hypothetical protein LOC100509587[Homo sapiens]
Chromosome: 6
This record was replaced with GeneID: 100506601
ID: 100509587

我想获取基因名称(ZFP112、SEP15、MLL4)、位置字段(如果存在)、ID 字段,并跳过其他内容。所有像 scan() 这样的字符串实用程序似乎都面向更常规的数据。记录之间的空白行实际上是记录分隔符。我可以将其写入磁盘并使用 readLines() 将其读回,但我更喜欢从内存中执行此操作,因为我是通过 HTTP 下载的。

【问题讨论】:

  • 您是如何通过 HTTP 下载的?目前是如何存储在内存中的?
  • @mnel: RCUrl::postForm 返回一个字符串(字符[1])。

标签: r parsing flat-file


【解决方案1】:

例如,从"myfile.dat" 读取数据(或者如果您之前已将其作为单独的行读取,则只需从下面的L 开始)。现在提取那些以数字开头、后跟点后跟空格或包含单词Location: 或以ID: 开头的行。然后删除这些行中的所有内容,包括最后一个空格。创建一个组向量g,它标识v2 的每个组件所属的组。 (我们使用了每个组的开始字段以非数字开头,其他字段以数字开头的事实。)然后将v2 拆分为这些组。通过适当插入一个 NA 来扩展 s 的短组件,假设如果它的短 Location: 丢失。 (我们假设第一个字段和ID 字段不能丢失。)最后转置它,使字段在列中,案例在行中。

L <- readLines("myfile.dat")
v <- grep("^\\d+\\. |Location: |^ID: ", L, value = TRUE)
v2 <- sub(".* ", "", v)

g <- cumsum(regexpr("^\\D", v2) > 0)
s <- split(v2, g)
m <- sapply(s, function(x) if (length(x) == 2) c(x[[1]], NA, x[[2]]) else x)
t(m)

使用帖子中的示例数据,我们从最后一行得到:

  [,1]           [,2]      [,3]       
1 "ZFP112"       "19q13.2" "7771"     
2 "SEP15"        "1p31"    "9403"     
3 "MLL4"         "19q13.1" "9757"     
4 "LOC100509547" NA        "100509547"
5 "LOC100509587" NA        "100509587"

【讨论】:

  • 很抱歉没有给出 Location 缺失的例子——这会扰乱你原本非常优雅的解决方案。我还添加了一个我没有意识到我需要的字段(ID)。我试过"^\\d+\\. |Location|^ID:",但是当某些位置丢失时,矩阵重塑是一个问题。
  • 据此修改了答案。
猜你喜欢
  • 1970-01-01
  • 2011-12-18
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2020-06-28
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多