숫자 형 벡터를 목록으로 계산하지 못하도록 slide () 함수를 중지하는 방법은 무엇입니까?
나는이 data.frame
하나의 열을 :
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()
and 를 사용하여이 새 열을 계산하려고 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-[벡터 (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