默认情况下,使用read.zoo停止将数据作为因子读取

默认情况下,使用read.zoo停止将数据作为因子读取,r,csv,time-series,zoo,R,Csv,Time Series,Zoo,我正在使用R中的zoo包分析数据的时间序列。我有以下数据文件: Date(dd-mm-yy),Time(hh:mm:ss),Julian_Day,AOT_1640,AOT_1020,AOT_870,AOT_675,AOT_667,AOT_555,AOT_551,AOT_532,AOT_531,AOT_500,AOT_490,AOT_443,AOT_440,AOT_412,AOT_380,AOT_340,Water(cm),%TripletVar_1640,%TripletVar_1020,%Tr

我正在使用R中的
zoo
包分析数据的时间序列。我有以下数据文件:

Date(dd-mm-yy),Time(hh:mm:ss),Julian_Day,AOT_1640,AOT_1020,AOT_870,AOT_675,AOT_667,AOT_555,AOT_551,AOT_532,AOT_531,AOT_500,AOT_490,AOT_443,AOT_440,AOT_412,AOT_380,AOT_340,Water(cm),%TripletVar_1640,%TripletVar_1020,%TripletVar_870,%TripletVar_675,%TripletVar_667,%TripletVar_555,%TripletVar_551,%TripletVar_532,%TripletVar_531,%TripletVar_500,%TripletVar_490,%TripletVar_443,%TripletVar_440,%TripletVar_412,%TripletVar_380,%TripletVar_340,%WaterError,440-870Angstrom,380-500Angstrom,440-675Angstrom,500-870Angstrom,340-440Angstrom,440-675Angstrom(Polar),Last_Processing_Date(dd/mm/yyyy),Solar_Zenith_Angle
29:03:2011,09:26:28,88.393380,N/A,0.490230,0.553836,0.707512,N/A,N/A,N/A,N/A,N/A,0.911939,N/A,N/A,0.984430,N/A,1.046517,1.081283,1.632430,N/A,4.597345,4.551429,3.216097,N/A,N/A,N/A,N/A,N/A,2.587552,N/A,N/A,2.694179,N/A,2.085042,2.522511,2.309844,0.851964,0.497006,0.789257,0.898093,0.362423,N/A,13/04/2011,58.822462
29:03:2011,09:41:28,88.403796,N/A,0.440362,0.513093,0.676703,N/A,N/A,N/A,N/A,N/A,0.893867,N/A,N/A,0.965588,N/A,1.034943,1.079975,1.654521,N/A,12.867837,12.687550,11.037238,N/A,N/A,N/A,N/A,N/A,9.345739,N/A,N/A,8.423888,N/A,8.421787,9.334135,1.622026,0.937815,0.529939,0.852553,0.999260,0.431102,N/A,13/04/2011,57.070624
29:03:2011,10:11:29,88.424641,N/A,0.565148,0.654724,0.842142,N/A,N/A,N/A,N/A,N/A,1.070556,N/A,N/A,1.144966,N/A,1.208759,1.242663,1.666760,N/A,9.933505,9.499251,8.327355,N/A,N/A,N/A,N/A,N/A,6.781617,N/A,N/A,6.612952,N/A,5.600500,5.630695,1.302058,0.826713,0.438445,0.736362,0.884554,0.316539,N/A,13/04/2011,53.916620
29:03:2011,10:17:46,88.429005,N/A,0.593881,0.681572,0.866620,N/A,N/A,N/A,N/A,N/A,1.095508,N/A,N/A,1.168008,N/A,1.233022,1.268572,1.704882,N/A,4.072782,3.752197,3.210935,N/A,N/A,N/A,N/A,N/A,2.389567,N/A,N/A,2.385582,N/A,1.653326,1.015620,0.728711,0.798185,0.427272,0.716165,0.853963,0.319100,N/A,13/04/2011,53.323057
29:03:2011,10:26:27,88.435035,N/A,0.636627,0.714175,0.884887,N/A,N/A,N/A,N/A,N/A,1.092220,N/A,N/A,1.167024,N/A,1.224264,1.271774,1.626393,N/A,16.400200,10.585139,6.513873,N/A,N/A,N/A,N/A,N/A,3.169704,N/A,N/A,4.085949,N/A,3.963741,8.663229,10.035231,0.724581,0.411533,0.659996,0.764539,0.329073,N/A,13/04/2011,52.544475
我正在尝试使用以下代码读取它:

f <- function(d, t) as.chron(paste(as.Date(chron(d, format='d:m:y')), t))

z = read.zoo("110329_110329_Chilbolton.lev10", sep=',', header=T, index = 1:2, FUN=f, as.is=F, dec=".")
默认情况下,如何停止将数据作为因子读取?数据可以通过
read.table
读取,无需任何额外参数来告诉它,以确保所有内容都保持为数字而不是因子-那么为什么
read.zoo
的行为会有所不同呢

我想我可以使用colClasses来指定每一列的类型,但如果数据集中列的顺序发生了变化,我不希望这样做——默认情况下,让它转换为数字,然后在不起作用的情况下尝试使用factors会更好


有什么想法吗?

read.zoo()
中的
..
将允许您将
stringsAsFactors=F
传递到
read.table()
。这应该可以解决问题。

您的数据文件给
read.zoo
带来了两个问题

首先,它使用
N/A
来表示缺少的值,而不是
NA
字符串,默认情况下,
read.table()。这可以通过设置
na.strings=“N/A”
来解决

第二个问题是数据文件的最后一列
last\u Processing\u Date.dd.mm.yyyy
包含字符串

但是,根据动物园常见问题解答文档:

“动物园”对象可以是(1)数字向量,(2)数字矩阵或(3)因子,但也可以是 不同时包含数值向量和因子

当“被要求”读取包含两个数字字符值的一串列时,将所有内容转换为因子是
read.zoo()
能够生成符合这三个条件之一的对象的唯一方法

如果删除有问题的列,并指定缺少的值字符串,则一切都会顺利进行。如果您确实需要数字列和系数列,上面链接的常见问题解答建议了几种可能的方法

z <- read.table("110329_110329_Chilbolton.lev10", sep=",", header=T,
                stringsAsFactors=FALSE, na.strings="N/A")
z$Last_Processing_Date.dd.mm.yyyy. <- NULL
z <- zoo(x=z[,-1:-2], order.by=f(z[[1]], z[[2]]))
summary(z)

     Index                       Julian_Day       AOT_1640      AOT_1020     
 Min.   :(03/29/11 09:26:28)   Min.   :88.39   Min.   : NA   Min.   :0.4404  
 1st Qu.:(03/29/11 09:41:28)   1st Qu.:88.40   1st Qu.: NA   1st Qu.:0.4902  
 Median :(03/29/11 10:11:29)   Median :88.42   Median : NA   Median :0.5651  
 Mean   :(03/29/11 10:00:44)   Mean   :88.42   Mean   :NaN   Mean   :0.5452  
 3rd Qu.:(03/29/11 10:17:46)   3rd Qu.:88.43   3rd Qu.: NA   3rd Qu.:0.5939  
 Max.   :(03/29/11 10:26:27)   Max.   :88.44   Max.   : NA   Max.   :0.6366  

z这已经被诊断出来了,但是让我们添加它,这样我们就有了一个
read.zoo
语句的例子,可以在这里使用

有两个问题:(1)NAs表示为N/A而不是NA,因此我们必须告诉它。(2) 最后第二列不是数字。zoo将数据表示为矩阵,因此数据必须全部为数字(factor zoo对象也受支持,但不能混合使用)

试试这个(我们在示例中添加了第二个数据行,以便更好地度量)。确保使用zoo的最新版本来运行示例数据,因为
text=
参数(指定数据本身的文本而不是文件名)是最近才添加的。还要注意的是,在R
中,read.zoo
提供了帮助,
vignette(“zoo read”)
提供了一个完全用于
read.zoo
示例的文档

Lines <- "Date(dd-mm-yy),Time(hh:mm:ss),Julian_Day,AOT_1640,AOT_1020,AOT_870,AOT_675,AOT_667,AOT_555,AOT_551,AOT_532,AOT_531,AOT_500,AOT_490,AOT_443,AOT_440,AOT_412,AOT_380,AOT_340,Water(cm),%TripletVar_1640,%TripletVar_1020,%TripletVar_870,%TripletVar_675,%TripletVar_667,%TripletVar_555,%TripletVar_551,%TripletVar_532,%TripletVar_531,%TripletVar_500,%TripletVar_490,%TripletVar_443,%TripletVar_440,%TripletVar_412,%TripletVar_380,%TripletVar_340,%WaterError,440-870Angstrom,380-500Angstrom,440-675Angstrom,500-870Angstrom,340-440Angstrom,440-675Angstrom(Polar),Last_Processing_Date(dd/mm/yyyy),Solar_Zenith_Angle
29:03:2011,09:26:28,88.393380,N/A,0.490230,0.553836,0.707512,N/A,N/A,N/A,N/A,N/A,0.911939,N/A,N/A,0.984430,N/A,1.046517,1.081283,1.632430,N/A,4.597345,4.551429,3.216097,N/A,N/A,N/A,N/A,N/A,2.587552,N/A,N/A,2.694179,N/A,2.085042,2.522511,2.309844,0.851964,0.497006,0.789257,0.898093,0.362423,N/A,13/04/2011,58.822462
29:03:2012,09:26:28,88.393380,N/A,0.490230,0.553836,0.707512,N/A,N/A,N/A,N/A,N/A,0.911939,N/A,N/A,0.984430,N/A,1.046517,1.081283,1.632430,N/A,4.597345,4.551429,3.216097,N/A,N/A,N/A,N/A,N/A,2.587552,N/A,N/A,2.694179,N/A,2.085042,2.522511,2.309844,0.851964,0.497006,0.789257,0.898093,0.362423,N/A,13/04/2011,58.822462"

library(chron)
library(zoo)
colClasses <- c("character", "character", rep("numeric", 43))
colClasses[44] <- "NULL" # zap the non-numeric column
z <- read.zoo(text = Lines, header = TRUE, sep = ",", na.strings = "N/A",
    index = 1:2, colClasses = colClasses, FUN = function(d, t)
        as.chron(paste(d, t), "%d:%m:%Y %H:%M:%S"))

Lines问题似乎是您正在从Excel文件导入,而没有花时间将“N/A”值转换为正确的NA值。这将导致列被视为非数字列。zoo包需要coredata是一个矩阵,这严重限制了可用于处理的选项。一切都需要数字。即使您输入stringsAsFactors=FALSE,您仍然会得到您期望的数字字符列

如果您使用read.table读入并将
as.is=TRUE,
您可以克服因子问题。然后,您需要强制希望为数字的列,并删除将以“Last_Processing_date.dd.mm.yyyy”名称出现的尾随日期列

我会先这样做:

z = read.table(file.choose(), sep=',', header=T,  as.is=TRUE, dec=".")
然后选择要强制为数字的列:

z[ , 3:43] <- sapply(z[ , 3:43], as.numeric)

z[,3:43]+1请注意,我坚信
TRUE
/
FALSE
应始终以长格式编写。声明一个名为F的变量太容易了,这可能会导致各种意想不到的事情,在这里您为
FALSE
编写了
F
,感谢您的建议,但是这似乎不起作用,我仍然将所有数值输出作为因子(与上面的输出没有区别)。还有其他想法吗?啊…对不起,罗宾。我无法确定测试,因为您的代码对我不起作用。我想我缺少了
as.chron
函数。让我追踪一下,看看…
as.chron
是否在chron包中,如果这样有帮助的话…
library(chron)
应该加载它。@Andrie:我个人最喜欢的是:
F Correct.…如果你查看
read.zoo()
,你会看到数据被
as.matrix()
强制,这是“如果存在任何非-(数字/逻辑/复杂)列,将返回字符矩阵”。
z[ , 3:43] <- sapply(z[ , 3:43], as.numeric)