Bir dizi verinin başında haddeleme araçları ve uygulama araçları

Veri kümesinde önceki 4 değerin yuvarlanma ortalamasını yapmak istiyorum. Ancak, başlangıç ​​için, 4 değer olmadığı için, 1/2/3 gözlemlerin dönme ortalamasını yapmak istiyorum. Bunu nasıl yaparım?

 library(zoo)
 df= data.frame(a=c(1,2,3,4,5))
 df$answer = rollapply(df$a, 4,mean)
 #help

Örneğin, satır 1, 1 değerinde, satır 2 (1 + 2) /2=1.5 değerinde, satır 3 ise 6/3 = 2 değerinde olacaktır.

4 dönemlik haddeleme araçları yapmak istiyorum ancak daha az ayın olduğu dönemlerde, izin verilen maksimum sürelerin ortalamasını yapmak istiyorum.

6
Faydalı soru!
katma yazar Colonel Beauvel, kaynak
Faydalı soru!
katma yazar Colonel Beauvel, kaynak

8 cevap

partial = TRUE , yani rollapplyr (..., partial = TRUE) veya rollapplyr (..., align = "right", kısmi) ile doğru hizalamayı kullanın = TRUE ). Burada rollapplyr kullanıyoruz:

rollapplyr(df$a, 4, mean, partial = TRUE)
7
katma
aradığım şey buydu ... fonksiyonu içindeki doğru bayrakları bulamadı. teşekkür ederim ve herkese teşekkür ederim!
katma yazar runningbirds, kaynak

partial = TRUE , yani rollapplyr (..., partial = TRUE) veya rollapplyr (..., align = "right", kısmi) ile doğru hizalamayı kullanın = TRUE ). Burada rollapplyr kullanıyoruz:

rollapplyr(df$a, 4, mean, partial = TRUE)
7
katma
aradığım şey buydu ... fonksiyonu içindeki doğru bayrakları bulamadı. teşekkür ederim ve herkese teşekkür ederim!
katma yazar runningbirds, kaynak

Paket olmadan da deneyebilirsiniz:

sapply(seq_along(df$a), function(u) mean(df$a[max(u-3,0):u]))
#[1] 1.0 1.5 2.0 2.5 3.5

Veya vektörelleştirilmiş bir çözüm - döngü olmadan - temel R :

with(df, (cumsum(a) - c(rep(0,4),head(a,-4)))/pmin(seq_along(a),4))
#[1] 1.0 1.5 2.0 2.5 3.5
3
katma

Paket olmadan da deneyebilirsiniz:

sapply(seq_along(df$a), function(u) mean(df$a[max(u-3,0):u]))
#[1] 1.0 1.5 2.0 2.5 3.5

Veya vektörelleştirilmiş bir çözüm - döngü olmadan - temel R :

with(df, (cumsum(a) - c(rep(0,4),head(a,-4)))/pmin(seq_along(a),4))
#[1] 1.0 1.5 2.0 2.5 3.5
3
katma

Bunun basit bir işlevle (alternatif bir çözüm olarak) yapılabileceğini düşünüyorum:

rollapply2 <- function(myvec, width, fun){
  #the first values up to width
  firstvalues  <- cumsum(myvec[1:(width-1)])/(1:(width-1))
  #the rest of the values as normal
  normalvalues <- rollapply(myvec, width, fun)
  #return them all
  c(firstvalues,normalvalues)
}

Çıktı:

> rollapply2(df$a, 4, mean)
[1] 1.0 1.5 2.0 2.5 3.5
3
katma

Bunun basit bir işlevle (alternatif bir çözüm olarak) yapılabileceğini düşünüyorum:

rollapply2 <- function(myvec, width, fun){
  #the first values up to width
  firstvalues  <- cumsum(myvec[1:(width-1)])/(1:(width-1))
  #the rest of the values as normal
  normalvalues <- rollapply(myvec, width, fun)
  #return them all
  c(firstvalues,normalvalues)
}

Çıktı:

> rollapply2(df$a, 4, mean)
[1] 1.0 1.5 2.0 2.5 3.5
3
katma

Fazladan NA eklemekten ne haber?

rollapply(c(rep(NA, 3),df$a), 4, FUN = mean, align = "right", na.rm = TRUE)
1
katma

Fazladan NA eklemekten ne haber?

rollapply(c(rep(NA, 3),df$a), 4, FUN = mean, align = "right", na.rm = TRUE)
1
katma