在R中导入具有所需数据结构的txt文件

时间:2014-04-29 08:21:22

标签: r read.table

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

2 个答案:

答案 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时,它将跳过实际上有三个字段的标题行