我有这个csv文件(fm.file):
Date,FM1,FM2
28/02/2011,14.571611,11.469457
01/03/2011,14.572203,11.457512
02/03/2011,14.574798,11.487183
03/03/2011,14.575558,11.487802
04/03/2011,14.576863,11.490246
等等。
我运行这个命令:
fm.data <- as.xts(read.zoo(file=fm.file,format='%d/%m/%Y',tz='',header=TRUE,sep=','))
is.character(fm.data)
我得到以下内容:
[1] TRUE
如何在不丢失日期索引的情况下将fm.data设为数字。我想执行一些需要数据为数字的统计操作。
答案 0 :(得分:2)
我对两件事情感到困惑:似乎'read.zoo'不应该给你一个字符矩阵,并且它似乎不会改变它的类会影响索引值,因为数据类型应该与指数分开。那么我试图复制问题并获得不同的结果:
txt <- "Date,FM1,FM2
28/02/2011,14.571611,11.469457
01/03/2011,14.572203,11.457512
02/03/2011,14.574798,11.487183
03/03/2011,14.575558,11.487802
04/03/2011,14.576863,11.490246"
require(xts)
fm.data <- as.xts(read.zoo(file=textConnection(txt),format='%d/%m/%Y',tz='',header=TRUE,sep=','))
is.character(fm.data)
#[1] FALSE
str(fm.data)
#-------------
An ‘xts’ object from 2011-02-28 to 2011-03-04 containing:
Data: num [1:5, 1:2] 14.6 14.6 14.6 14.6 14.6 ...
- attr(*, "dimnames")=List of 2
..$ : NULL
..$ : chr [1:2] "FM1" "FM2"
Indexed by objects of class: [POSIXct,POSIXt] TZ:
xts Attributes:
List of 2
$ tclass: chr [1:2] "POSIXct" "POSIXt"
$ tzone : chr ""
zoo-和xts-objects将数据放在用coredata
访问的矩阵中,它们的索引是一组独立的属性。
答案 1 :(得分:1)
我认为问题是你的csv文件中有一些脏数据。换句话说,FM1或FM2列包含某个字符,可以阻止它被解释为数字列。当发生这种情况时,XTS(下面是一个矩阵)将强制整个事物成为字符类型。
以下是使用R查找可疑数据的一种方法:
s <- scan(fm.file,what="character")
# s is now a vector of character strings, one entry per line
s <- s[-1] #Chop off the header row
all(grepl('^[-0-9,.]*$',s,perl=T)) #True means all your data is clean
s[ !grepl('^[-0-9,.]*$',s,perl=T) ]
which( !grepl('^[-0-9,.]*$',s,perl=T) ) + 1
倒数第二行打印出包含您不期望的字符的所有csv行。最后一行告诉你文件中的哪些行(+1因为我们删除了标题行)。
答案 2 :(得分:0)
为什么不简单地使用read.csv
然后使用Date
将第一列转换为as.Date
对象
> x <- read.csv(fm.file, header=T)
> x$Date <- as.Date(x$Date, format="%d/%m/%Y")
> x
Date FM1 FM2
1 2011-02-28 14.57161 11.46946
2 2011-03-01 14.57220 11.45751
3 2011-03-02 14.57480 11.48718
4 2011-03-03 14.57556 11.48780
5 2011-03-04 14.57686 11.49025