我有一个固定的列宽文件,每隔5行有一个标题(包含重要信息)。像这样:
XX ZZ MM
1 12 5 22 9 12 13 11 17 21
2 12 6 22 10 12 14 11 18 21
3 12 7 22 11 12 15 11 19 21
4 12 8 22 12 12 16 11 20 21
AA BB CC
1 12 5 12 9 11 13 21 17 21
2 12 6 22 10 12 14 11 18 21
3 12 7 22 11 12 15 11 19 21
4 12 8 22 12 12 16 11 20 21
首先,我希望能够阅读该文件。我在laf_open_fwf
包中使用laf
取得了一些成功。
但是,当我使用此功能时,我会丢失标题信息或数据,具体取决于我设置固定列宽的位置。
数据按列组织,以便奇数列(第一,第三,第五,第七和第九)是ID号,偶数列是实际数据。
我最终想要的是这样的事情:
XX ZZ MM 1 12
XX ZZ MM 2 12
XX ZZ MM 3 12
XX ZZ MM 4 12
XX ZZ MM 5 22
XX ZZ MM 6 22
XX ZZ MM 7 22
XX ZZ MM 8 22
XX ZZ MM 9 12
XX ZZ MM 10 12
XX ZZ MM 11 12
XX ZZ MM 12 12
XX ZZ MM 13 11
XX ZZ MM 14 11
XX ZZ MM 15 11
XX ZZ MM 16 11
XX ZZ MM 17 21
XX ZZ MM 18 21
XX ZZ MM 19 21
XX ZZ MM 20 21
XX ZZ MM 21 21
AA BB CC 1 12
AA BB CC 2 12
AA BB CC 3 12
AA BB CC 4 12
AA BB CC 5 22
AA BB CC 6 22
AA BB CC 7 22
AA BB CC 8 22
AA BB CC 9 12
AA BB CC 10 12
AA BB CC 11 12
AA BB CC 12 12
AA BB CC 13 11
AA BB CC 14 11
AA BB CC 15 11
AA BB CC 16 11
AA BB CC 17 21
AA BB CC 18 21
AA BB CC 19 21
AA BB CC 20 21
AA BB CC 21 21
感谢您的帮助。
答案 0 :(得分:1)
您可以读取文件,遍历行,并测试每行是否为标题。如果它不是标题行,则打印出我们看到的最新标题以及一次两个数据值。它看起来像这样:
text <- readLines('/path/to/file') # read in the file
split_text <- strsplit(text, "\\s+") # split each line on whitespace
for (line in split_text) { # iterate through lines
numeric_line <- suppressWarnings(as.numeric(line)) # try to convert the current line into a vector of numbers
if (is.na(numeric_line[[1]])) { # if it fails, we know we're on a header line
header <- line
} else {
for (i in seq(1, length(line), 2)) { # otherwise, we're on a data line, so take two numbers at once
print(c(header, line[[i]], line[[i+1]])) # and output the latest header with each pair of values
}
}
}
这只是打印到标准输出,因为没有指定特定的输出。请注意,输出的顺序与您显示的示例不完全相同 - 如果您希望按顺序排列,则必须先存储输出,然后对其进行排序。