如何将这样的输入文件加载到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
答案 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)。