我正在尝试使用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 ....)。如何定期忽略读取标题?
答案 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)))