【问题标题】:import txt file with desired data structure in R在R中导入具有所需数据结构的txt文件
【发布时间】:2014-06-15 01:44:09
【问题描述】:

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

【问题讨论】:

  • 你的列是用空格分隔的,列的宽度是固定的,是这样吗?
  • 是的。用固定列宽的空格分隔

标签: r read.table


【解决方案1】:

您可以使用read.fwf 读取固定宽度的文件。您需要正确指定每列的宽度,以空格为单位。

data <- read.fwf(path, widths=c(-12, 8, -4, 2), header=T)

关键是如何指定宽度。负面意味着跳过那么多地方,正面意味着阅读那么多。我假设最后一列中的条目只有 2 位数字。如果不是这种情况,请相应地更改 widths。您可能还必须修复列名。

如果文件格式发生变化,您将不得不更改索引,或者想出一些巧妙的regexp 从前几行读取它。更好的解决方案是将您的字符串包含在 " 中,或者更好的是完全避免这种格式。

【讨论】:

    【解决方案2】:
    ?count.fields
    

    正如 R 文档所述,count.fields 计算文件读取的每一行中的字段数(以 sep 分隔),当您设置 count.fields(path, blank.lines.skip=FALSE) == 4 时,它将跳过实际上具有三个字段的标题行。

    【讨论】:

    • 那我如何将 3 分配给 header 并将 4 分配给主要数据?
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2016-01-03
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多