我试图通过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))
我的功能有什么问题?我怎么能这么容易做到?
答案 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)