r - 将制表符分隔的数据解析为 R data.table/data.frame 时如何排除某些行?

标签 r parsing data.table csv

这个问题与以下问题有关:

How to parse tab-delimited data (of different formats) into a data.table/data.frame?

我有一个格式错误的文本文件,其中以制表符分隔的格式如下:

A   1092    -   1093    +   1X
B   1093    HRDCPMRFYT
A   1093    +   1094    -   1X
B   1094    BSZSDFJRVF
A   1094    +   1095    +   1X
B   1095    SSTFCLEPVV
...

但是,文本文件中有几行长行,它们在技术上以制表符分隔,但都是长字符串。例如这里的“Z”和“Y”行
Z  FX:E:4.2
Y   23434M,23434M,23434M,23434M,23434M,23434M,23434M,23434M,23434M,23434M,23434M,23434M,23434M,23434M,23434M,23434M,23434M,23434M,23434M,23434M,23434M,23434M,23434M,23434M,23434M,23434M,23434M,23434M,23434M,23434M,23434M,23434M,23434M,23434M,23434M,23434M,23434M,23434M,23434M,23434M,23434M,23434M,23434M,23434M,23434M,23434M,23434M,23434M,23434M,23434M,23434M,23434M,23434M,23434M,23434M,23434M,23434M,23434M,23434M,23434M,23434M,23434M,23434M,23434M,23434M,23434M,23434M,23434M,23434M,23434M 
A   1092    -   1093    +   1X
B   1093    HRDCPMRFYT
A   1093    +   1094    -   1X
B   1094    BSZSDFJRVF
A   1094    +   1095    +   1X
B   1095    SSTFCLEPVV
...

该文本文件的一部分是 Y 23434M,23434M,...可能有几 GB 长。

这些行非常罕见,仅用前面的 Z 标记。或 Y .我目前在文本编辑器中打开了该文件并删除了这些行。

然而,这在算法上是不合理的。有没有办法解析这个文件,使得 (1) 只有行 AB使用或 (2) 行 ZY明确没有使用?

编辑:澄清一下,Z 不是一个长字符串。这里只有“Y”是一个长字符串。是格式为 X XX:X:0.0 的字符串, 由此 X是一个字符和 0一个整数。

最佳答案

您可以使用系统调用来修复文件,例如 sed ,按一定的模式。如果要删除所有以 Z 开头的行或 Y你可以简单地传递一个正则表达式,后跟 /d

system("sed -i '/^[ZY]/d' test.tab")

上面的命令将从您的文件中删除所有以 Z 或 Y 开头的行。然后,您可以运行我在上一个问题中发布的相同代码
library(data.table)
fread("sed '$!N;s/\\n/ /' test.tab")
#    V1   V2 V3   V4 V5   V6   V7         V8
# 1:  A 1092  - 1093  + 1X B 1093 HRDCPMRFYT
# 2:  A 1093  + 1094  - 1X B 1094 BSZSDFJRVF
# 3:  A 1094  + 1095  + 1X B 1095 SSTFCLEPVV

数据
text <- "Z FX:E:4.2
Y  23434M,23434M,23434M,23434M,23434M,23434M,23434M,23434M,23434M,23434M,23434M,23434M,23434M,23434M,23434M,23434M,23434M,23434M,23434M,23434M,23434M,23434M,23434M,23434M,23434M,23434M,23434M,23434M,23434M,23434M,23434M,23434M,23434M,23434M,23434M,23434M,23434M,23434M,23434M,23434M,23434M,23434M,23434M,23434M,23434M,23434M,23434M,23434M,23434M,23434M,23434M,23434M,23434M,23434M,23434M,23434M,23434M,23434M,23434M,23434M,23434M,23434M,23434M,23434M,23434M,23434M,23434M,23434M,23434M,23434M 
A   1092    -   1093    +   1X
B   1093    HRDCPMRFYT
A   1093    +   1094    -   1X
B   1094    BSZSDFJRVF
A   1094    +   1095    +   1X
B   1095    SSTFCLEPVV"

# Saving it as tab separated file on disk
write(gsub(" +", "\t", text), file = "test.tab")

关于r - 将制表符分隔的数据解析为 R data.table/data.frame 时如何排除某些行?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/50316300/

相关文章:

rdata:某种方法来遍历数据框的列名?

r - 如何将对称矩阵信息提取到R中的数据帧

javascript - 验证 JavaScript 中的数学表达式?

java - Java 中的 XML 文件解析显示错误详细信息

r - 识别值在另一个特定值之后出现的情况

r - 在 knitr 中跨 block 传递图形参数

json - 将导入的 json 数据导入数据框

parsing - ANTLR4:TokenStreamRewriter输出的格式不正确(删除了空格)

R:将行拆分为多行,然后将列拆分为多列

r - 基于列名模式的多个成对差异