在R中读取ascii文件

时间:2013-04-10 07:42:10

标签: r header read.table

我正在尝试使用read.table读取R中的文件(ascii)  该文件如下所示:

  DAILY MAXIMUM TEMPARATURE  
  YEAR DAY MT DT   LAT. 66.5   67.5   68.5   69.5   70.5
  1969 001 01 01   6.5  99.90  99.90  31.90  99.90  99.90 
  1969 001 01 01   7.5  99.90  20.90  99.90  99.90  23.90
  1969 001 01 01   8.5  99.90  99.90  30.90  99.90  18.90
  .....
  ..... 
  YEAR DAY MT DT   LAT. 66.5   67.5   68.5   69.5   70.5
  1969 001 01 02   6.5  21.90  99.90  99.90  99.90  99.90 
  1969 001 01 02   7.5  99.90  33.90  99.90  99.90  99.90
  1969 001 01 02   8.5  99.90  99.90  15.90  99.90  99.90
  .....
  .....
  YEAR DAY MT DT   LAT. 66.5   67.5   68.5   69.5   70.5
  1969 001 01 03   6.5  99.90  99.90  99.90  99.90  99.90 
  1969 001 01 03   7.5  99.90  99.90  99.90  99.90  99.90
  1969 001 01 03   8.5  99.90  99.90  99.90  99.90  99.90
  .....
  .....

我用以下方式阅读:

inp=read.table("MAXT1969.TXT",skip=1,header=T)

已读取文件,内容位于变量inp。

我有两个问题 -

予。查看前5列的命令提供了一些额外的信息以及所需的输出,    例如,inp [1,5]给出以下输出:

> inp[1,5]
  "[1] 6.5
  33 Levels: 10.5 11.5 12.5 13.5 14.5 15.5 16.5 17.5 18.5 19.5 20.5 21.5 ... LAT."

我不想要额外的信息,只需要价值。我哪里错了?

II。每隔32行,我就有一个标题(YEAR DAY ....)。如何定期忽略读取标题?

3 个答案:

答案 0 :(得分:6)

尝试comment.char="Y",这会使read.table忽略以Y开头的所有行。 stringsAsFactors=FALSE会避免将字符串转换为因子。

inp <- read.table("MAXT1969.TXT", skip = 1, header=FALSE, comment.char="Y", stringsAsFactors=FALSE )

#Read just first row to get header names
cols <- read.table("MAXT1969.TXT", header=FALSE, skip=1, nrows=1  )
names(inp) <- cols  

inp
##   YEAR DAY MT DT LAT. 66.5 67.5 68.5 69.5 70.5
## 1 1969   1  1  1  6.5 99.9 99.9 31.9 99.9 99.9
## 2 1969   1  1  1  7.5 99.9 20.9 99.9 99.9 23.9
## 3 1969   1  1  1  8.5 99.9 99.9 30.9 99.9 18.9
## 4 1969   1  1  2  6.5 21.9 99.9 99.9 99.9 99.9
## 5 1969   1  1  2  7.5 99.9 33.9 99.9 99.9 99.9
## 6 1969   1  1  2  8.5 99.9 99.9 15.9 99.9 99.9
## 7 1969   1  1  3  6.5 99.9 99.9 99.9 99.9 99.9
## 8 1969   1  1  3  7.5 99.9 99.9 99.9 99.9 99.9
## 9 1969   1  1  3  8.5 99.9 99.9 99.9 99.9 99.9

#Since the stringsAsFactor = FALSE was used numbers were read correctly. 
inp[1, 5]
## [1] 6.5

答案 1 :(得分:1)

问题1:这意味着您的值已被读作factor,即分类变量。只需在列上使用as.numeric即可将其从factor转换为numeric。或者,您可以使用colClasses read.table参数直接指定文件中列的类型。

问题2:您可以使用readLines阅读这些行,使用YEAR查找以grep开头的行,删除这些行,并将此编辑后的输出读取为data.frame使用read.table(textConnection(edited_data))。我会使用@ geektrader的解决方案,但我只是想完整地添加它。

答案 2 :(得分:0)

另一个解决方案是引入NAs然后省略它们 -

inp = as.data.frame(na.omit(apply(apply(inp, 2, as.character), 2, as.numeric)))
相关问题