txt就像
#---*----1----*----2----*---
Name Time.Period Value
A Jan 2013 10
B Jan 2013 11
C Jan 2013 12
A Feb 2013 9
B Feb 2013 11
C Feb 2013 15
A Mar 2013 10
B Mar 2013 8
C Mar 2013 13
我尝试将read.table与readLines和count.field一起使用,如下所示:
> path <- list.files()
> data <- read.table(text=readLines(path)[count.fields(path, blank.lines.skip=FALSE) == 4])
Warning message:
In readLines(path) : incomplete final line found on 'data1.txt'
> data
V1 V2 V3 V4
1 A Jan 2013 10
2 B Jan 2013 11
3 C Jan 2013 12
4 A Feb 2013 9
5 B Feb 2013 11
6 C Feb 2013 15
7 A Mar 2013 10
8 B Mar 2013 8
9 C Mar 2013 13
问题在于它提供了四个属性而不是三个属性。因此,我操纵我的数据如下,寻找替代方案。
> library(zoo)
> data$Name <- as.character(data$V1)
> data$Time.Period <- as.yearmon(paste(data$V2, data$V3, sep=" "))
> data$Value <- as.numeric(data$V4)
> DATA <- data[, 5:7]
> DATA
Name Time.Period Value
1 A Jan 2013 10
2 B Jan 2013 11
3 C Jan 2013 12
4 A Feb 2013 9
5 B Feb 2013 11
6 C Feb 2013 15
7 A Mar 2013 10
8 B Mar 2013 8
9 C Mar 2013 13
答案 0 :(得分:3)
您可以使用read.fwf
来读取固定宽度的文件。您需要在空格中正确指定每列的宽度。
data <- read.fwf(path, widths=c(-12, 8, -4, 2), header=T)
关键是如何指定宽度。否定意味着跳过那么多地方,积极意味着读许多地方。我假设最后一列中的条目只有2位数。如果不是这样,请相应地更改widths
。您可能还需要修复列名称。
如果文件格式发生变化,您将不得不更改索引,或者想出一些聪明的regexp
来从前几行读取它。一个更好的解决方案是将您的字符串括在"
中,或者更好的是,完全避免使用该格式。
答案 1 :(得分:0)
?count.fields
由于R文档声明count.fields计算每个文件行读取的字段数(以sep分隔),当您设置count.fields(path, blank.lines.skip=FALSE) == 4
时,它将跳过实际上有三个字段的标题行