slide()関数が数値ベクトルを計算してリストに入れるのを止める方法は?
私はdata.frame
1つの列のを持っています:
Price <- c(1, 2, 5, 3, 1, 4, 7, 10, 6)
df <- data.frame(Price)
7つの数値ごとに最大値を計算したいので、次のようになります。
df$MaxPrice <- c(1, 2, 5, 5, 5, 5, 7, 10, 10)
私は、この新しい列を計算しようとすると、しかし、mutate()
そしてslide()
、それは代わりに数値変数の、私のデータフレーム内のリストを返します。
library(dplyr)
library(slider)
df <- df %>%
mutate(MaxPrice = slide(Price, max, .before = 7, .after = 0, .complete = F))
なぜこれが起こっているのですか、そしてどのようにslide()
数値変数を返すようにするのですか?
回答
デフォルトのメソッドがlist
出力を要求しているようです。による?slide
vec_ptype(slide(.x))== list()
の説明.ptype
は
.ptype- [vector(0)/ NULL]
出力のタイプに対応するプロトタイプ。
デフォルトのNULLの場合、出力タイプは、.fの呼び出しの結果全体で共通のタイプを計算することによって決定されます。
指定されている場合、.fへの各呼び出しの結果はそのタイプにキャストされ、最終出力はそのタイプになります。
getOption( "vctrs.no_guessing")がTRUEの場合、.ptypeを指定する必要があります。これは、本番コードに固定タイプを要求させる方法です。
(下記)のソースコードに基づいて、本質的には、それが戻ってデフォルトであるlist
と私たちは、特定の方法を選ぶ限り、すなわちを説明することを防ぐために、何の選択肢はなさそうです_vec
か_dbl
どちらか flatten
library(dplyr)
library(slider)
library(purrr)
out <- df %>%
mutate(MaxPrice = slide(Price, max, .before = 7, .after = 0,
.complete = FALSE) %>% flatten_dbl)
str(out)
#'data.frame': 9 obs. of 2 variables:
# $ Price : num 1 2 5 3 1 4 7 10 6 # $ MaxPrice: num 1 2 5 5 5 5 7 10 10
または、タイプ固有の方法を使用します。 slide_dbl
out <- df %>%
mutate(MaxPrice = slide_dbl(Price, max, .before = 7, .after = 0,
.complete = FALSE) )
str(out)
#'data.frame': 9 obs. of 2 variables:
# $ Price : num 1 2 5 3 1 4 7 10 6 # $ MaxPrice: num 1 2 5 5 5 5 7 10 10
のソースコードを確認するとslide
、が呼び出され、その情報を渡すオプションがないとslide_impl
想定さ.ptype
れlist
ます。slide
slide
function (.x, .f, ..., .before = 0L, .after = 0L, .step = 1L,
.complete = FALSE)
{
slide_impl(.x, .f, ..., .before = .before, .after = .after,
.step = .step, .complete = .complete, .ptype = list(),
.constrain = FALSE, .atomic = FALSE)
}
さて、それを_dbl
方法と比較してください
slide_dbl
function (.x, .f, ..., .before = 0L, .after = 0L, .step = 1L,
.complete = FALSE)
{
slide_vec_direct(.x, .f, ..., .before = .before, .after = .after,
.step = .step, .complete = .complete, .ptype = double())
}
cummax
ベースRで関数を使用できます。
Price <- c(1, 2, 5, 3, 1, 4, 7, 10, 6)
cummax(Price)
[1] 1 2 5 5 5 5 7 10 10
マルチベクトルの場合。データベクトルを行列にロードし、列にcummaxを適用します。フォローオン治療のためのcummaxベクトルの行列を生成します。
Prices <- sample(1:10, 70, replace = TRUE) # dummy data
[1] 10 1 1 9 9 6 6 9 7 3 6 4 10 4 8 6 6 9 2 1 6 4 7 10 1 6 5 2 7 7 4 6 7 7 7
[36] 2 8 5 4 8 4 7 7 1 7 5 9 6 7 3 10 5 10 1 2 5 1 1 8 5 8 8 6 8 6 8 10 4 8 8
matPrices <- matrix(Prices, ncol = 10)
[,1] [,2] [,3] [,4] [,5] [,6] [,7] [,8] [,9] [,10]
[1,] 10 9 8 4 7 2 7 3 1 8
[2,] 1 7 6 7 7 8 1 10 1 6
[3,] 1 3 6 10 4 5 7 5 8 8
[4,] 9 6 9 1 6 4 5 10 5 10
[5,] 9 4 2 6 7 8 9 1 8 4
[6,] 6 10 1 5 7 4 6 2 8 8
[7,] 6 4 6 2 7 7 7 5 6 8
matcummax <- apply(matPrices, 2, cummax)
[,1] [,2] [,3] [,4] [,5] [,6] [,7] [,8] [,9] [,10]
[1,] 10 9 8 4 7 2 7 3 1 8
[2,] 10 9 8 7 7 8 7 10 1 8
[3,] 10 9 8 10 7 8 7 10 8 8
[4,] 10 9 9 10 7 8 7 10 8 10
[5,] 10 9 9 10 7 8 9 10 8 10
[6,] 10 10 9 10 7 8 9 10 8 10
[7,] 10 10 9 10 7 8 9 10 8 10