R从字符到数字

时间:2012-09-27 06:57:48

标签: r csv character-encoding xts

我有这个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设为数字。我想执行一些需要数据为数字的统计操作。

3 个答案:

答案 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