如何使用for循环来计算窗口大小为10的移动平均值使用第5列

时间:2018-01-21 16:13:55

标签: r

我有一个包含5列的data.csv文件。现在我想使用for循环来计算窗口大小为10的移动平均值,使用R中的第5列。

for(i in 1: length[ , 5]-9) {  
 data$Mean [i] <- mean (data[i,5]:data[(i+9),5]) 
} 

这意味着计算10个连续行的平均值,并通过创建新列将它们存储在同一数据框中

计算错误,我得到的错误如下.....

  

数据[i,5]出错:数据[(i + 9),5]:NA / NaN参数

1 个答案:

答案 0 :(得分:1)

你在计算平均值的行中犯了几个错误。最重要的一点是,当您尝试计算数据帧的最后9行的平均值时,您将超出范围。也就是说,如果您的数据框有100行,则按行92,您试图得到行的平均值92:101;当然,没有第101行。

它应该是这样的:

for(i in 1: length(data[ , 5]-9)) {  
    data$Mean [i] <- mean(data[i:min(i+9, nrow(data)),5]) 
}

此外,使用data作为变量名称通常是一个坏主意,因为基础data()中已存在R函数。只需选择一个类似的名称,例如“mydata”

下面是一个可重现的例子,它将获得接下来十行的平均值,或者最后9行的n个下一行的平均值。

mydata <- data.frame(col_1 = rnorm(100),
                     col_2 = rnorm(100),
                     col_3 = rnorm(100),
                     col_4 = rnorm(100),
                     col_5 = rnorm(100))


for(i in 1: length(mydata[ , 5]-9)) {  
    mydata$Mean [i] <- mean(mydata[i:min(i+9, nrow(mydata)),5]) 
}

head(mydata)

如果您不想获得最后十行的平均值,请改为:

for(i in 1: length(mydata[ , 5]-9)) {  
    mydata$Mean [i] <- ifelse( i + 9 <= nrow(mydata),
                               mean(mydata[i:min(i+9, nrow(mydata)),5]),
                               NA)
}