通过R中的for循环进行方差数据分析

时间:2014-12-16 15:50:00

标签: r for-loop variance

我试图通过for循环分析我的温度数据的方差,以便删除一些错误的雪数据。 这个想法是,如果温度低于0°C并且如果接下来的3个值的方差超过0.1(这里的值仅为示例),则它不能是雪(但如果方差较弱,则可以);所以我将这些数据的积雪深度设置为0。 我试着写一个小函数来做。没有错误,但没有任何反应。我在for-loop中的写法必须是不正确的。

    data <- data.frame(temperature=c(1,2,0,-1,-5,-3,-4,-1,-1,-1),snow=c(3,4,5,10,
    11,12,12,15,15,16))    

    plant <- function(x,y){
    for (j in 1:length(x)) 
    { if(!is.na(x[j]) && !is.na(x[(j+3)]) && (x[j]<0) 
    && (x[(j+3)]<0) && (var(x[j:(j+3)])>0.1))                    
        {y[j:(j+3)] <- 0 }
    }
    return(y)
    }

    data[,2] <- mapply(plant,data[,1],data[,2])

我的最终数据(在此示例中)应如下所示:

    finaldata <- data.frame(temperature=c(1,2,0,-1,-5,-3,-4,-1,-1,-1),
    snow=c(3,4,5,0,0,0,0,15,15,16)) 

我的功能有什么问题?我怎么能这么容易做到?

2 个答案:

答案 0 :(得分:2)

我建议使用rollapply向data.frame添加列,然后使用ifelse检查列值。

library(zoo)
#data$var3<- rollapply(data$snow, 3, var, fill=0, align="left")
data$var3 <- c(rollapply(data$snow, 3, var, align="left")[-1], rep(0,3))
data$snow3 <- ifelse(data$temp<0 & data$var3>0.1, 0, data$snow)

   temperature snow       var3 snow3
1            1    3 10.3333333     3
2            2    4 10.3333333     4
3            0    5  1.0000000     5
4           -1   10  0.3333333     0
5           -5   11  3.0000000     0
6           -3   12  3.0000000     0
7           -4   12  0.3333333     0
8           -1   15  0.0000000    15
9           -1   15  0.0000000    15
10          -1   16  0.0000000    16

答案 1 :(得分:0)

最后,我的解决方案是:

library(zoo)

data <- data.frame(temperature=c(1,2,0,-1,-5,-3,-4,-1,-1,-1),snow=c(3,4,5,10,
11,12,12,15,15,16))

data$var3 <- NA
for (i in 1:nrow(data)) {
if(!is.na(data[i,1]) && (data[i,1]<0)) {
j=(i+3)
data[i,3] <- var(data[i:j,1])
}
}

data$snow3 <- ifelse(data$temperature<0 & data$var3>0.1, 0, data$snow)