11

データフレームと動物園オブジェクトを切り替えるのが難しく、特に意味のある列名を維持するのが難しく、単変量と多変量の場合の不一致があります。

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は、日付列が含まれないため、使用するだけでは不十分です(日付は行名になります)。さらに作業が必要です。

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

4

5 に答える 5

16

ディメンションを削除したくない場合は、次を使用しますdrop=FALSE

R> (z1 <- read.zoo(df[,1:2], drop=FALSE))
           Lepisma saccharina
2012-01-01                  4
2012-01-02                  5
2012-01-03                  9
2012-01-04                  7

write.zoodata.frameの列として動物園のインデックスを含めたい場合のように行うことができます。

zoo.to.data.frame <- function(x, index.name="Date") {
  stopifnot(is.zoo(x))
  xn <- if(is.null(dim(x))) deparse(substitute(x)) else colnames(x)
  setNames(data.frame(index(x), x, row.names=NULL), c(index.name,xn))
}

アップデート:

df2b質問を簡潔にするために編集しようとした後、仕様に合わせて簡単に作成する方法を考えました(これはz1、寸法を削除しない場合にも機能します)。

R> (df2b <- data.frame(Date=time(z2), z2, check.names=FALSE, row.names=NULL))
        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
于 2012-12-28T04:36:38.360 に答える
5

データフレームから動物園に変換するには、次を使用しますread.zoo

library(zoo)
z <- read.zoo(df)

dropまた、のおよびその他の引数の可用性にも注意してください?read.zoo

動物園からインデックスを含むデータフレームに変換するには、次を使用しますfortify.zoo

fortify.zoo(z, name = "Date")

(ggplot2がロードされている場合は、そのまま使用できますfortify。)

質問の下のコメントで述べられているように、質問と他のいくつかの回答は時代遅れであるか、いくつかの重大な誤解があります。R自体との一貫性を含む動物園の設計哲学について説明しているhttps://cran.r-project.org/web/packages/zoo/vignettes/zoo-design.pdfを確認することをお勧めします。確かに、Rのデフォルトのセットと、動物園のデフォルトのセットを覚えておく必要がある場合、動物園の使用は非常に難しくなります。

于 2019-06-12T13:48:10.283 に答える
2

timetkパッケージを使用して、これに対する新しい簡単な解決策があります。xtsおよびを含むいくつかの時系列形式zootibblesに変換します。ラップインas.data.frameするだけでデータフレームを取得できます。

timetk::tk_tbl(zoo::read.zoo(df))
# A tibble: 4 x 3
  index      `Lepisma saccharina` `Thermobia domestica`
  <date>                    <dbl>                 <dbl>
1 2012-01-01                    4                     2
2 2012-01-02                    5                     6
3 2012-01-03                    9                     0
4 2012-01-04                    7                    11
于 2019-06-11T22:59:09.153 に答える
0

少し回ります。まず、動物園をcsvファイルに書き込み、次にdata.frameに再度読み込みます。インデックス列の名前はデフォルトで「インデックス」になりますが、パラメータを使用して変更できます。

library(zoo)
date <-
  seq.Date(
    from = as.Date("2017-01-01"),
    to = as.Date("2017-01-10"),
    by = "days"
  )
value <- seq.int(from = 100, to = length(date))
vzoo <- zoo(value, date)
write.zoo(
  vzoo,
  index.name = "Date",
  file = "tmp.txt",
  sep = ",",
  col.names = TRUE
)
vzoo.df <- read.csv("tmp.txt", sep = ',')
于 2017-01-19T20:27:49.970 に答える
0

新しいデータセットを作成し、as.data.frameを追加してfortify.zooをラップするだけです。これは役立つはずです。z2 = as.data.frame(fortify.zoo(z、name = "Date"))

于 2019-07-05T05:50:44.777 に答える