我很难在数据框和动物园对象之间切换,尤其是保持有意义的列名,以及单变量和多变量情况之间的不一致:
library(zoo)
#sample data, two species counts over time
t = as.Date(c("2012-01-01", "2012-01-02", "2012-01-03", "2012-01-04"))
n1 = c(4, 5, 9, 7) #counts of Lepisma saccharina
n2 = c(2, 6, 0, 11) #counts of Thermobia domestica
df = data.frame(t, n1, n2)
colnames(df) <- c("Date", "Lepisma saccharina", "Thermobia domestica")
#converting to zoo loses column names in univariate case...
> z1 <- read.zoo(df[,1:2]) #time series for L. saccharina
> colnames(z1)
NULL
> colnames(z1) <- c("Lepisma saccharina") #can't even set column name manually
Error in `colnames<-`(`*tmp*`, value = "Lepisma saccharina") :
attempt to set colnames on object with less than two dimensions
#... but not in multivariate case
> z2 <- read.zoo(df) #time series for both species
> colnames(z2)
[1] "Lepisma saccharina" "Thermobia domestica"
要以原始格式从动物园对象返回到数据框,仅使用
as.data.frame
是不够的,因为它不包含Date列(日期以行名结尾):需要做更多的工作。zooToDf <- function(z) {
df <- as.data.frame(z)
df$Date <- time(z) #create a Date column
rownames(df) <- NULL #so row names not filled with dates
df <- df[,c(ncol(df), 1:(ncol(df)-1))] #reorder columns so Date first
return(df)
}
这在多变量情况下效果很好,但显然在单变量情况下无法恢复有意义的列名:
> df2b <- zooToDf(z2)
> df2b
Date Lepisma saccharina Thermobia domestica
1 2012-01-01 4 2
2 2012-01-02 5 6
3 2012-01-03 9 0
4 2012-01-04 7 11
> df1b <- zooToDf(z1)
> df1b
Date z
1 2012-01-01 4
2 2012-01-02 5
3 2012-01-03 9
4 2012-01-04 7
有一种简单的方法可以处理单变量和多变量情况吗?看来
z1
需要以某种方式记住列名。 最佳答案
要将数据帧转换为动物园,请使用read.zoo
:
library(zoo)
z <- read.zoo(df)
还要注意
drop
和?read.zoo
中其他参数的可用性。并要将其从Zoo转换为数据帧(包括索引),请使用
fortify.zoo
:fortify.zoo(z, name = "Date")
(如果加载了ggplot2,则可以只使用
fortify
。)如该问题下方评论中所述,该问题以及其他一些答案要么已过时,要么存在重大误解。建议您回顾https://cran.r-project.org/web/packages/zoo/vignettes/zoo-design.pdf,其中讨论了Zoo的设计理念,其中包括与R本身的一致性。如果您必须记住R的一组默认值和Zoo的另一组默认值,无疑使用zoo会困难得多。
关于R在Zoo对象和数据帧之间转换,结果对于不同数量的列不一致吗?,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/14064097/