0

問題の説明
私は三月のデータをたくさん扱っています。毎月 3 回 (またはほぼ 10 日ごと、10 日ごと)、これは、旧ソ連の水関連データと、世界中のより多くの気候/水関連データ セットの典型的なレポート間隔です。以下は、2 つの変数を含むデータ セットの例です。

> date = unique(floor_date(seq.Date(as.Date("2019-01-01"), as.Date("2019-12-31"), 
                                    by="day"), "10days"))
> example_data <- tibble(
    date = date[day(date)!=31],  
    value = seq(1,36,1),  
    var = "A") %>%
    add_row(tibble(
      date = date[day(date)!=31],  
      value = seq(10,360,10),  
      var = "B")) 
> example_data
# A tibble: 72 x 3
# Groups:   var [2]
   date       value var  
   <ord>      <dbl> <chr>
 1 2019-01-01     1 A    
 2 2019-01-01    10 B    
 3 2019-01-11     2 A    
 4 2019-01-11    20 B    
 5 2019-01-21     3 A    
 6 2019-01-21    30 B    
 7 2019-02-01     4 A    
 8 2019-02-01    40 B    
 9 2019-02-11     5 A    
10 2019-02-11    50 B    
# … with 62 more rows

この例では、1.、11.、および 21. を選択して 10 年の日付を示していますが、実際には、1 か月あたり 1 ~ 3 デカド (1 年あたり 1 ~ 12 ヶ月に類似) または 1 デカドでインデックス化する方が適切です。年間 36 まで (年間通算日と同じ)。最も洗練された解決策は、 のようなデカダル データの適切な日付形式を持つことyearmonthですlubridate。ただし、lubridate近い将来 dekadal データをサポートする予定はないかもしれません ( github の会話)。

tsibbleと を使用したワークフローがありますtimetkが、これは月次データでうまく機能しますが、元のデカダル時間ステップで作業する方が実際には適切であり、面倒な回避策を最小限に抑えてデカダル データで tidyverse 関数を使用できる方法を探しています。できるだけ。
tsibble の dekadal データに毎日の日付を使用する際の問題は、時間間隔が毎日として識別され、1 か月あたりの 3 つの値の間に多くのデータ ギャップが生じることです。

> example_data_tsbl <- as_tsibble(example_data, index = date, key = var)
> count_gaps(example_data_tsbl, .full = FALSE)
# A tibble: 70 x 4
   var   .from      .to           .n
   <chr> <date>     <date>     <int>
 1 A     2019-01-02 2019-01-10     9
 2 A     2019-01-12 2019-01-20     9
 3 A     2019-01-22 2019-01-31    10
# … 

これが私がこれまでにしたことです:

  1. ここでは、順序付き因子をインデックスとして定義する可能性を見ましたtsibbleが、因子をインデックスtimetkとして認識しません。timetkカスタム インデックスを定義することを提案します (2. を参照)。
  2. tsibble にカスタム インデックスを追加する可能性はありますが、これに関する例が見つからず、これらの関数をどのように使用する必要があるかわかりません (ビネットはまだ計画中です)。関数を使用して dekadal データをサポートする方法を理解しようとコードを読み始めましたが、少し圧倒されます。

質問

  • tsibble の dekadal カスタム インデックスは yearmonth または weekyear と同様に動作しますか?

  • カスタム インデックスを tsibble に追加する方法について共有する例を誰かここに持っていますか?

  • または、tidyverse でデカダル データをエレガントに処理する別の方法を知っている人はいますか?

4

2 に答える 2

0

新しいインデックスをサポートするために tsibble を拡張するには、これらのジェネリックのメソッドを定義する必要があります。

  • index_valid()- クラスがインデックスとして受け入れられる場合、このメソッドは TRUE を返す必要があります
  • interval_pull()- このメソッドはインデックス値を受け入れ、データの間隔を計算します。間隔は を使用して作成できますtsibble:::new_interval()tsibble::gcd_interval()最小間隔の計算に役立つ場合があります。
  • seq()および+- これらのメソッドは、関数を使用して将来の時間値を生成するために使用されnew_data()ます。

「年」の新しい tsibble インデックス クラスの最小限の例は次のとおりです。

library(tsibble)
#> 
#> Attaching package: 'tsibble'
#> The following objects are masked from 'package:base':
#> 
#>     intersect, setdiff, union
library(vctrs)

# Object creation function
my_year <- function(x = integer()) {
  x <- vec_cast(x, integer())
  vctrs::new_vctr(x, class = "year")
}

# Declare this class as a valid index
index_valid.year <- function(x) TRUE

# Compute the interval of a year input
interval_pull.year <- function(x) {
  tsibble::new_interval(
    year = tsibble::gcd_interval(vec_data(x))
  )
}

# Specify how sequences are generated from years
seq.year <- function(from, to, by, length.out = NULL, along.with = NULL, ...) {
  from <- vec_data(from)
  if (!rlang::is_missing(to)) {
    vec_assert(to, my_year())
    to <- vec_data(to)
  }
  my_year(NextMethod())
}

# Define `+` operation as needed for `new_data()`
vec_arith.year <- function(op, x, y, ...) {
  my_year(vec_arith(op, vec_data(x), vec_data(y), ...))
}

# Use the new index class
x <- tsibble::tsibble(
  year = my_year(c(2018, 2020, 2024)),
  y = rnorm(3), 
  index = "year"
)
x
#> # A tsibble: 3 x 2 [2Y]
#>     year      y
#>   <year>  <dbl>
#> 1   2018  0.211
#> 2   2020 -0.410
#> 3   2024  0.333
interval(x)
#> <interval[1]>
#> [1] 2Y
new_data(x, 3)
#> # A tsibble: 3 x 1 [2Y]
#>     year
#>   <year>
#> 1   2026
#> 2   2028
#> 3   2030

reprex パッケージ(v0.3.0)により 2021-02-08 に作成

于 2021-02-08T12:59:39.860 に答える