我有一个包含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参数
答案 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)
}