根据观察之间的差异分配NA值

时间:2014-08-05 18:13:21

标签: r if-statement na

我是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声明对我来说似乎很难。希望任何人都可以通过提供代码来提供帮助。

感谢。

2 个答案:

答案 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