跳过数据文件中的所有行,然后在R中的循环中包含常规字符串

时间:2016-10-27 16:08:50

标签: r read.table

我有一台工具可以生成包含大量标题信息的数据文件。我希望一次读取多个文件,并rbind一起读取它们。为了成功阅读这些,我一直在使用以下循环并跳过来处理标题信息:

df <- c()
for (x in list.files(pattern="*.cnv", recursive=TRUE)) {
u <-read.table(x, skip=100)
      df <- rbind(df, u)
}

以下是有5行要跳过的数据文件的示例:

# Header information
# Header information
# Header information
# Header information
# Header information
*END*
      0.571    26.6331     8.2733    103.145     0.0842  -0.000049  0.000e+00
      0.576    26.6316     8.2756    103.171     0.3601  -0.000049  0.000e+00
      0.574    26.6322     8.2744    103.157     0.3613  -0.000046  0.000e+00

问题是要跳过的行数是动态的,我想提出一个通用的解决方案。幸运的是,每个文件都以此结尾:

*END*

所以我的问题是,我如何阅读上述文件中跳过所有行并包含*END*行?这可能会在rbind之前发生。

2 个答案:

答案 0 :(得分:1)

使用

逐行读取输入
all_content = readLines("input.txt")
>all_content
[1] "# Header information"                                                         
[2] "# Header information"                                                         
[3] "# Header information"                                                         
[4] "# Header information"                                                         
[5] "# Header information"                                                         
[6] "*END*"                                                                        
[7] "      0.571    26.6331     8.2733    103.145     0.0842  -0.000049  0.000e+00"
[8] "      0.576    26.6316     8.2756    103.171     0.3601  -0.000049  0.000e+00"
[9] "      0.574    26.6322     8.2744    103.157     0.3613  -0.000046  0.000e+00"

然后删除这些行,直到您使用grep按下* END *,如下所示

skip = all_content[-c(1:grep("*END*",all_content))]

现在使用正常的read.table函数进行阅读,如下所示

input <- read.table(textConnection(skip))
> input
     V1      V2     V3      V4     V5       V6 V7
1 0.571 26.6331 8.2733 103.145 0.0842 -4.9e-05  0
2 0.576 26.6316 8.2756 103.171 0.3601 -4.9e-05  0
3 0.574 26.6322 8.2744 103.157 0.3613 -4.6e-05  0

你得到了理想的结果。

<强>更新

在你的循环中,只需使用

for (x in list.files(pattern="*.cnv", recursive=TRUE)) {
   all_content <- readLines(x)
   skip = all_content[-c(1:grep("*END*",all_content))]
   input <- read.table(textConnection(skip))
   df <- rbind(df, input)
}

答案 1 :(得分:1)

您可以使用skip

中的data.table::fread()选项
library(data.table)
dT = fread("# Header information
  # Header information
  # Header information
  # Header information
  # Header information
  *END*
    0.571    26.6331     8.2733    103.145     0.0842  -0.000049  0.000e+00
  0.576    26.6316     8.2756    103.171     0.3601  -0.000049  0.000e+00
  0.574    26.6322     8.2744    103.157     0.3613  -0.000046  0.000e+00", 
  skip ="*END*")