【问题标题】:assign NA value based on difference between observations根据观察值之间的差异分配 NA 值
【发布时间】:2014-08-05 18:13:20
【问题描述】:

我是 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,那么将给x[i]赋一个NA值。

IF THEN 语句对我来说似乎很难。希望任何人都可以通过提供代码来提供帮助。

谢谢。

【问题讨论】:

  • 你能解释一下你过滤掉异常值的实际逻辑吗? 看起来您可能对diff 感兴趣,但您的问题并不清楚。
  • @AnandaMahto 谢谢你的问题,我可能没有说清楚。是的,我想我对 diff 语句很感兴趣。具体来说,对于数据框中的所有变量,除了“temp”变量之外,我想编写一个 IF 语句,对于所有 mydata$x[i] 观察,如果 mydata$x[i]-mydata$x[i- 1] > 10,那么 mydata$x[i] 将被分配一个 NA 值。
  • @Vicki1227 请在下面查看我的答案

标签: r if-statement na


【解决方案1】:

您可以通过以下方式做到这一点:

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

【讨论】:

    【解决方案2】:

    根据您在 cmets 部分中的要求,Temp 的任何值如果与之前的值(正或负)相比变化超过 10 度,都将替换为 NA:

    mydata$Temp[c(FALSE, abs(diff(mydata$Temp)) > 10)] <- NA
    

    但是,这不仅消除了异常值。它还排除了简单地从极值恢复正常的值。例如,温度从 28.6 --> 52.1 --> 28.6 变为某个点。通过此替换,值变为 28.6 --> NA --> NA。

    如果您只是想消除异常值,我建议排除超出某个“正常”范围的值,例如:

    mydata$Temp[mydata$Temp < 18.6 | mydata$Temp > 38.6] <- NA
    

    【讨论】:

    • 谢谢,但是除了“temp”变量之外,还有其他方法可以同时处理多个变量吗?当观察值与前一个观察值之间的差异大于 10 时,我想将 NA 值分配给数据框中的所有观察值。
    • 如果绝对值大于10,是否要改为NA,还是只在变化为+10时才改为NA?
    • abs值大于10
    • 当我看到您打算使用哪些变量时,我会回复您关于多个变量的评论
    猜你喜欢
    • 2020-07-13
    • 2015-04-22
    • 2019-06-03
    • 2022-11-30
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2021-01-28
    相关资源
    最近更新 更多