簡體   English   中英

R語言-欄平均滾動平均值

[英]R Language - Rolling averages across columns

我正在嘗試對某些NFL數據進行3欄平均滾動計算,這是數據和結果數據幀:

數據:

Player <- c("Player1", "Player2", "Player3", "Player4", "Player5")
Week1 <- c(10, 5, 6, 8, 7)
Week2 <- c(12, 9, 4, 2, 8)
Week3 <- c(4, 5, 4, 3, 12)
Week4 <- c(15, 7, 12, NA, 5)
Week5 <- c(NA, 5, 8, 11, 6)
q <- data.frame(Player, Week1, Week2, Week3, Week4, Week5)

數據框:

   Player Week1 Week2 Week3 Week4 Week5
1 Player1    10    12     4    15    NA
2 Player2     5     9     5     7     5
3 Player3     6     4     4    12     8
4 Player4     8     2     3    NA    11
5 Player5     7     8    12     5     6

因此,我想做的是從第1周開始的整個星期內進行3次游戲滾動平均值。因此,對於玩家而言,將平均Week1,Week2,Week3並在新列中給我值,然后將其平均為Week2,Week3 ,第4周,然后在新列中給我該值,等等。

在這種情況下,新的數據框應如下所示:

   Player Week1 Week2 Week3 Week4 Week5    Avg1    Avg2    Avg3
1 Player1    10    12     4    15    NA     8.7    10.3     NA
2 Player2     5     9     5     7     5     6.3     7.0     5.7
3 Player3     6     4     4    12     8     4.7     6.7     8.0
4 Player4     8     2     3    NA    11     4.3     4.3     5.3
5 Player5     7     8    12     5     6     9.0     8.3     7.7

請注意,對於第4周的Player4,有一個NA被忽略了……那一周該玩家由於某種原因沒有參加比賽,因此我將前兩款游戲和之后的游戲用於Avg3。

我需要這些新列,因為我將進行回歸分析,以查看3的平均值是否可以預測下一個值。 我所能找到的一切都具有滾動平均值,但我經驗不足,因此,對於此類問題的數據格式化方面的任何幫助都將受到贊賞。 先謝謝您的幫助!

我們可以使用zoo包中的rollmean

library(zoo)
t(apply(q[-1], 1, function(x) rollmean(x, 3))))


#       Week2     Week3    Week4
#[1,] 8.666667 10.333333       NA
#[2,] 6.333333  7.000000 5.666667
#[3,] 4.666667  6.666667 8.000000
#[4,] 4.333333        NA       NA
#[5,] 9.000000  8.333333 7.666667

最后,要獲得一個組合的數據框,

cbind(q, t(apply(q[-1], 1, function(x) rollmean(x, 3))))

#   Player Week1 Week2 Week3 Week4 Week5    Week2     Week3    Week4
#1 Player1    10    12     4    15    NA 8.666667 10.333333       NA
#2 Player2     5     9     5     7     5 6.333333  7.000000 5.666667
#3 Player3     6     4     4    12     8 4.666667  6.666667 8.000000
#4 Player4     8     2     3    NA    11 4.333333        NA       NA
#5 Player5     7     8    12     5     6 9.000000  8.333333 7.666667

如果您對列名有特定的了解,可以隨時通過以下方式進行更改

temp <- t(apply(q[-1], 1, function(x) rollmean(x, 3)))
colnames(temp) <- c("avg1", "avg2", "avg3")

然后在temp上使用cbind

編輯

要回答OP的幾個問題,

如果一開始要刪除多個列,則只需選擇/取消選擇具有其索引號的列

例如,

要取消選擇前兩列,您可以使用q[-c(1:2)]等於q[3:7] ,從而為它提供一系列取消選擇/選擇的值。

function(x)被稱為匿名函數,您可以使用該函數將自己的函數應用於數據框的每一行。

rollmean不處理NA值。 從文件?rollmean

rollmean的默認方法不處理包含NA的輸入。 在這種情況下,請改用rollapply。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM