2

我正在尝试使用 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 中。

我有2个问题-

I. 查看前 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."

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

二、在每 32 行之后,我有一个标题(YEAR DAY ....)。如何忽略定期阅读标题?

4

3 回答 3

6

试试comment.char="Y"这将read.table忽略所有以 . 开头的行YstringsAsFactors=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
于 2013-04-10T07:59:12.893 回答
1

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

问题 2:您可以使用 读取行readLines,找到以YEARusing开头的行grep,删除这些行,然后将编辑后的输出读入data.frameusing read.table(textConnection(edited_data))。我会改用@geektrader 的解决方案,但为了完整起见,我只想添加它。

于 2013-04-10T08:02:36.557 回答
0

另一种解决方案是引入 NA,然后省略它们 -

inp = as.data.frame(na.omit(apply(apply(inp, 2, as.character), 2, as.numeric)))
于 2013-04-10T08:22:06.647 回答