คำนวณความผิดปกติของอนุกรมเวลาด้วยข้อมูลที่จัดกลุ่ม

โพสต์ การคำนวณความผิดปกติในอนุกรมเวลามีประโยชน์มาก แต่ฉันได้จัดกลุ่มแล้ว ข้อมูลในสถานการณ์ของฉัน ฉันมีกรอบข้อมูลพร้อมปี กลุ่ม ค่า และคอลัมน์ แต่ละกลุ่มมีค่าสำหรับแต่ละปี สิ่งที่ผมต้องการคำนวณคือความผิดปกติในแต่ละปีในแต่ละกลุ่ม กล่าวคือ มูลค่าปีนี้ลบด้วยค่าเฉลี่ยตลอดหลายปีที่ผ่านมาของกลุ่มนั้น เป็นการดีที่จะผนวกค่าความผิดปกตินี้เป็นคอลัมน์ในกรอบข้อมูลด้วย ขอบคุณ! นี่คือข้อมูลตัวอย่าง

year <- c(2000, 2000, 2000, 2000, 2000,2001, 2001, 2001, 2001, 2001,2002, 2002, 2002, 2002, 2002,2003, 2003, 2003, 2003, 2003)
group <- c("A", "B", "C", "D", "A", "B", "C", "D","A", "B", "C", "D","A", "B", "C", "D","A", "B", "C", "D")
value <- runif(20, 0, 1)
df <- as.data.frame(year)
df$group <- group
df$value <- value

person wraymond    schedule 04.02.2016    source แหล่งที่มา
comment
โปรดแสดงปัญหาของคุณด้วยชุดข้อมูลตัวอย่างพร้อมกับผลลัพธ์ที่ต้องการ   -  person mtoto    schedule 04.02.2016


คำตอบ (1)


อีกตัวอย่างหนึ่งที่ฟังก์ชัน ave มีประโยชน์ (และด้วยเหตุนี้จริงๆ แล้วอาร์กิวเมนต์ FUN จึงไม่จำเป็น แต่สิ่งสำคัญที่ต้องจำไว้ว่าอยู่หลังจุดไข่ปลาในรายการอาร์กิวเมนต์ และดังนั้นจึงจำเป็นต้องเป็นอาร์กิวเมนต์ที่มีชื่อหากใช้):

df$grp.means <-with( df, ave(value,group, FUN=mean )
df$yr.anomaly <- df$value-df$grp.means
df
 year group      value grp.means   yr.anomaly
 2000     A 0.40778676 0.4135109 -0.005724164
 2000     B 0.02709893 0.2660400 -0.238941031
 2000     C 0.30375035 0.6461923 -0.342441950
 2000     D 0.46330590 0.4901705 -0.026864586
 2000     A 0.98482498 0.4135109  0.571314056
 2001     B 0.02279144 0.2660400 -0.243248519
 2001     C 0.64370031 0.6461923 -0.002491994
 2001     D 0.28803650 0.4901705 -0.202133986
 2001     A 0.40769648 0.4135109 -0.005814443
 2001     B 0.21896143 0.2660400 -0.047078526
 2002     C 0.83771796 0.6461923  0.191525655
 2002     D 0.61869987 0.4901705  0.128529384
 2002     A 0.06946549 0.4135109 -0.344045431
 2002     B 0.14443442 0.2660400 -0.121605537
 2002     C 0.95324165 0.6461923  0.307049349
 2003     D 0.60165466 0.4901705  0.111484174
 2003     A 0.19778091 0.4135109 -0.215730018
 2003     B 0.91691357 0.2660400  0.650873612
 2003     C 0.49255124 0.6461923 -0.153641061
 2003     D 0.47915550 0.4901705 -0.011014985

สามารถทำได้ในขั้นตอนเดียว:

df$yr.anomaly <- with( df, ave(value, group, FUN=function(x) x- mean(x)))
person IRTFM    schedule 04.02.2016
comment
ขอบคุณนะที่รัก! ฉันสงสัยว่า ave() จะเกี่ยวข้อง - person wraymond; 04.02.2016