我有一台工具可以生成包含大量标题信息的数据文件。我希望一次读取多个文件,并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
之前发生。
答案 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*")