将此格式加载到R数据帧中

时间:2012-03-02 08:57:43

标签: r dataframe

如何将这样的输入文件加载到R数据帧中?

    [S1]     [E1]  |     [S2]     [E2]  |  [LEN 1]  [LEN 2]  |  [% IDY]  | [TAGS]
=====================================================================================
  959335   959806  |      169      640  |      472      472  |    80.84  | LmjF.34      ULAVAL|LtaPseq521
  322990   324081  |     1436      342  |     1092     1095  |    83.86  | LmjF.12      ULAVAL|LtaPseq501
  324083   324327  |      245        1  |      245      245  |    91.84  | LmjF.12      ULAVAL|LtaPseq501
 1097873  1098325  |      892      437  |      453      456  |    76.75  | LmjF.32      ULAVAL|LtaPseq491
 1098566  1098772  |      207        4  |      207      204  |    75.60  | LmjF.32      ULAVAL|LtaPseq491

3 个答案:

答案 0 :(得分:3)

这看起来像固定宽度格式化数据,并且可以使用read.fwf轻松读入 - 棘手的位可能会摆脱|分数。您想对[TAGS]部分做什么?

这里我计算出每个字段的宽度,添加一些字段(长度为3)以跳过|标记,读入它,然后使用负列子集删除分隔符列:

> widths=c(8,9,3,9,9,3,9,9,3,9,3,100)
> read.fwf("data.txt",widths=widths,skip=2)[,-c(3,6,9,11)]
       V1      V2   V4  V5   V7   V8   V10                             V12
1  959335  959806  169 640  472  472 80.84  LmjF.34      ULAVAL|LtaPseq521
2  322990  324081 1436 342 1092 1095 83.86  LmjF.12      ULAVAL|LtaPseq501
3  324083  324327  245   1  245  245 91.84  LmjF.12      ULAVAL|LtaPseq501
4 1097873 1098325  892 437  453  456 76.75  LmjF.32      ULAVAL|LtaPseq491
5 1098566 1098772  207   4  207  204 75.60  LmjF.32      ULAVAL|LtaPseq491

您可能希望将标记拆分为两列 - 只需计算每个部分的宽度,并将字段宽度添加到宽度向量中。为读者练习。

请注意,这仅适用于文件与空格字符和非标签字符间隔开的情况......

答案 1 :(得分:1)

使用readLines或Scan

读取文件
  

测试< - '[S1] [E1] | [S2] [E2] | [LEN 1] [LEN 2] |   [%IDY] | [标签]

     

=============================================== ======================================

     

959335 959806 | 169 640 | 472 472 | 80.84 | LmjF.34 ULAVAL | LtaPseq521

     

322990 324081 | 1436 342 | 1092 1095 | 83.86 | LmjF.12 ULAVAL | LtaPseq501

     

324083 324327 | 245 1 | 245 245 | 91.84 | LmjF.12 ULAVAL | LtaPseq501

     

1097873 1098325 | 892 437 | 453 456 | 76.75 | LmjF.32 ULAVAL | LtaPseq491

     

1098566 1098772 | 207 4 | 207 204 | 75.60 | LmjF.32 ULAVAL | LtaPseq491'

     

test2< - gsub('|','',test,fixed = TRUE)

     

test2< - gsub('=','',test2,fixed = TRUE)

     

test3< - gsub('[\ t] {2,8}',';',test2,perl = TRUE)

     

test3< - gsub('\ n','',test3,perl = TRUE)

     

TEST4< -strsplit(TEST3,分裂= ';')

     

test5< - data.frame(matrix(test4 [[1]],ncol = 9,   byrow = T),stringsAsFactors = FALSE)

     

colnames(TEST5)[1:8]< -test5 [1,2:9]

     

TEST5< -test5 [-1,]

输出:

  

TEST5

[S1]    [E1] [S2] [E2] [LEN 1] [LEN 2] [% IDY] [TAGS]                 X9
     

2 959335 959806 169 640 472 472 80.84 LmjF.34 ULAVAL LTAPseq521

     

3 322990 324081 1436 342 1092 1095 83.86 LmjF.12 ULAVAL LTAPseq501

     

4 324083 324327 245 1 245 245 91.84 LmjF.12 ULAVAL LTAPseq501

     

5 1097873 1098325 892 437 453 456 76.75 LmjF.32 ULAVAL LTAPseq491

     

6 1098566 1098772 207 4 207 204 75.60 LmjF.32 ULAVAL LTAPseq491

答案 2 :(得分:0)

用这种方式用R不简单 如果你使用的是UNIX,它们是简单的脚本(比如在awk中),在导入它之前也可以转换大文件(我使用这个tecnique)。