我是R的新手,想在代码中寻求帮助。我有一个数据框“mydata”,其中包含多个变量。但由于我的一些代码无法正常工作,因此数据需要进行一些清理。例如,在逐分钟的“Temp”列中,一些异常值突然超出28左右的典型值,例如0,14,52 ...
温度 28.5 28.5 28.5 28.5 28.5 28.5 28.5 28.5 28.5 28.5 28.5 28.5 39.8 14 28.5 28.5 38.8 0 28.5 28.5 28.5 28.5 28.5 28.5 28.5 28.6 28.6 52.1 28.6 28.6 28.5 28.4 28.3 28.3 28.2 28.2 28.2 28.2 28.2 0
我想写一个if then语句来过滤掉这个数据帧中所有变量的异常值。这个想法是这样的:
for i in length(mydata) {
if (mydata[,i]-mydata[,i-1]>10)
mydata[,i] <- NA
}
要解释,对于任何变量mydata $ x,如果观察x [i]和x [i-1]之间的绝对差值大于10,则NA值将分配给x [i]。
IF THEN声明对我来说似乎很难。希望任何人都可以通过提供代码来提供帮助。
感谢。
答案 0 :(得分:0)
正如您在评论部分中所要求的那样,Temp
与前一个值(正面或负面)相差10度以上的任何值都被NA替换为:
mydata$Temp[c(FALSE, abs(diff(mydata$Temp)) > 10)] <- NA
但是,这不仅仅是异常值。它还排除了从极值返回到正常值的值。例如,有一个温度从28.6℃开始的点。 52.1 - &gt; 28.6。通过这种替换,值变为28.6-> NA - &gt; NA。
如果您只是想摆脱异常值,我建议您排除超出某些&#34;正常&#34;范围,例如:
mydata$Temp[mydata$Temp < 18.6 | mydata$Temp > 38.6] <- NA
答案 1 :(得分:0)
您可以通过以下方式完成此操作:
mydata$Temp <- lapply(mydata$Temp, function(x) if(x<38 & x > 18){x} else{NA} )
> mydata <- data.frame( Temp = c(28.5, 28.5, 28.5, 28.5, 28.5, 38.8, 0, 28.5, 28.5, 50, 0.2, 0))
> mydata
Temp
1 28.5
2 28.5
3 28.5
4 28.5
5 28.5
6 38.8
7 0.0
8 28.5
9 28.5
10 50.0
11 0.2
12 0.0
> mydata$Temp <- lapply(mydata$Temp, function(x) if(x<38 & x > 18){x} else{NA} )
> mydata
Temp
1 28.5
2 28.5
3 28.5
4 28.5
5 28.5
6 NA
7 NA
8 28.5
9 28.5
10 NA
11 NA
12 NA