وسائل المتداول وتطبيق الوسائل في بداية سلسلة من البيانات

أرغب في عمل متوسط ​​متدرج للقيم الأربعة السابقة في مجموعة بيانات. ومع ذلك ، بالنسبة للبداية ، حيث لا يوجد 4 قيم ، أريد أن أفعل المتوسط ​​المتداول للملاحظات 1/2/3. كيف أقوم بهذا العمل؟

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

على سبيل المثال ، سيكون للصف 1 قيمة 1 ، ويكون للصف 2 قيمة (1 + 2) /2=1.5 ، ويكون للصف 3 قيمة 6/3 = 2.

أريد أن أفعل اللف المتدحرج من 4 فترات ولكن في الفترات التي تقل عن الأشهر ، أريد أن أفعل متوسط ​​الفترات القصوى المسموح بها.

6
سؤال مفيد!
وأضاف المؤلف Colonel Beauvel, مصدر
سؤال مفيد!
وأضاف المؤلف Colonel Beauvel, مصدر

8 إجابة

استخدم aligment الصحيح مع جزئي = TRUE ، أي rollapplyr (... ، جزئي = TRUE) أو rollapply (... ، align = "right" ، جزئي = صحيح </القانون>). هنا نستخدم rollapplyr :

rollapplyr(df$a, 4, mean, partial = TRUE)
7
وأضاف
هذا هو ما كنت أبحث عنه ... لا يمكن معرفة الأعلام الصحيحة داخل وظيفته. شكرا لك وشكرا لكل الآخرين!
وأضاف المؤلف runningbirds, مصدر

استخدم aligment الصحيح مع جزئي = TRUE ، أي rollapplyr (... ، جزئي = TRUE) أو rollapply (... ، align = "right" ، جزئي = صحيح </القانون>). هنا نستخدم rollapplyr :

rollapplyr(df$a, 4, mean, partial = TRUE)
7
وأضاف
هذا هو ما كنت أبحث عنه ... لا يمكن معرفة الأعلام الصحيحة داخل وظيفته. شكرا لك وشكرا لكل الآخرين!
وأضاف المؤلف runningbirds, مصدر

يمكنك أيضًا تجربة دون حزمة:

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

أو حل متجه - بدون حلقة - قاعدة 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
وأضاف

يمكنك أيضًا تجربة دون حزمة:

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

أو حل متجه - بدون حلقة - قاعدة 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
وأضاف

أعتقد أنه يمكن ببساطة القيام به مع وظيفة بسيطة مثل التالية (كما حل بديل):

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)
}

انتاج:

> rollapply2(df$a, 4, mean)
[1] 1.0 1.5 2.0 2.5 3.5
3
وأضاف

أعتقد أنه يمكن ببساطة القيام به مع وظيفة بسيطة مثل التالية (كما حل بديل):

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)
}

انتاج:

> rollapply2(df$a, 4, mean)
[1] 1.0 1.5 2.0 2.5 3.5
3
وأضاف

ماذا عن إضافة NAs ​​إضافية؟

rollapply(c(rep(NA, 3),df$a), 4, FUN = mean, align = "right", na.rm = TRUE)
1
وأضاف

ماذا عن إضافة NAs ​​إضافية؟

rollapply(c(rep(NA, 3),df$a), 4, FUN = mean, align = "right", na.rm = TRUE)
1
وأضاف