dplyr
패키지에는 cummean
기능이 있습니다. 당신은> 0 만 원하는 경우, v>0
에 대한 V의 선택 값은 : 당신은 반복과 결과를 원하는 경우
v <- c(1, 3, 0, 3, 2, 0)
dplyr::cummean(v[v>0])
#> [1] 1.000000 2.000000 2.333333 2.250000
, 당신은 인덱스와 동물원에서 도우미 기능을 재생할 수 있습니다.
# Create a vector container for the result (here with NA values)
v_res <- v[NA]
# Fill cumsum where you want to calculate it (here v>0)
v_res[v>0] <- dplyr::cummean(v[v>0])
# Fill the gap with previous value
zoo::na.locf(v_res)
#> [1] 1.000000 2.000000 2.000000 2.333333 2.250000 2.250000
그것은 당신이 너무 tidyverse
을 사용할 수
v <- c(1, 3, 0, 3, -5, 2, 0, -6)
v_res <- v[NA]
v_res[v>0] <- dplyr::cummean(v[v>0])
zoo::na.locf(v_res)
#> [1] 1.000000 2.000000 2.000000 2.333333 2.333333 2.250000 2.250000 2.250000
너무 절에서 음의 값으로 작동합니다. 이 솔루션은 데이터가인 data.frame에 유용 할 수 있습니다.
library(dplyr, warn.conflicts = F)
library(tidyr)
data <- data_frame(v = c(1, 3, 0, 3, 2, 0)) %>%
tibble::rowid_to_column()
res <- data %>%
filter(v > 0) %>%
mutate(cummean = cummean(v)) %>%
right_join(data, by = c("rowid", "v")) %>%
fill(cummean)
res
#> # A tibble: 6 x 3
#> rowid v cummean
#> <int> <dbl> <dbl>
#> 1 1 1 1.000000
#> 2 2 3 2.000000
#> 3 3 0 2.000000
#> 4 4 3 2.333333
#> 5 5 2 2.250000
#> 6 6 0 2.250000
pull(res, cummean)[-1]
#> [1] 2.000000 2.000000 2.333333 2.250000 2.250000
하면 논리 벡터
v > 0
의 누적 합
v
의 누적 합을 나눔으로써이를 해결
확인을 내가 볼 수 있지만 그 자체로 평균이 아닙니다. '1 + 3 + 0/2'는 합계 된 3 개의 값을 나누기 위해 3 개의 값으로 나눠야합니다. 예상 결과에 맞게 답변을 업데이트하겠습니다. – cderv