根据 R 中的其他变量删除不符合阈值的数据

Remove data not fitting a threshold based on other variables in R

我正在尝试删除在恶劣条件下收集的特定数据 (NEE) (Ustar < ths)。阈值取决于季节。目前,我正在使用 for 循环,我知道 R 处理这些非常慢,所以我正在寻找更好的方法。数据框是多变量的,名为 Peaches。

DoY 是一年中的第几天,Ustar 是描述条件的变量,NEE 是在低 Ustar 值下被丢弃的观测值。季节性阈值标记为 ths_1、2、3 或 4,具体取决于一年中的时间。错误数据被标记为 -999(由于其他程序的要求),但可以设置为 NA,如果它使代码更高效,则稍后更改。

这是两年(Peaches13 和 Peaches14),年份的长度不必相同。多年的阈值是相同的,并且仅特定于季节。

这是我当前的设置:

for (i in 1:length(Peaches13$DoY)){
  if((Peaches13$DoY[i] < 90)&&(Peaches13$Ustar[i] < ths_1)){
    Peaches13$NEE[i] <- -999
    }
  if((Peaches13$DoY[i] < 180)&&(Peaches13$DoY[i] >= 90)&&(Peaches13$Ustar[i] < ths_2)){
    Peaches13$NEE[i] <- -999
  }
  if((Peaches13$DoY[i] < 270)&&(Peaches13$DoY[i] >= 180)&&(Peaches13$Ustar[i] < ths_3)){
    Peaches13$NEE[i] <- -999
  }
  if((Peaches13$DoY[i] >= 270)&&(Peaches13$Ustar[i] < ths_4)){
    Peaches13$NEE[i] <- -999
  }
}

for (i in 1:length(Peaches14$DoY)){
  if((Peaches14$DoY[i] < 90)&&(Peaches14$Ustar[i] < ths_1)){
    Peaches14$NEE[i] <- -999
  }
  if((Peaches14$DoY[i] < 180)&&(Peaches14$DoY[i] >= 90)&&(Peaches14$Ustar[i] < ths_2)){
    Peaches14$NEE[i] <- -999
  }
  if((Peaches14$DoY[i] < 270)&&(Peaches14$DoY[i] >= 180)&&(Peaches14$Ustar[i] < ths_3)){
    Peaches14$NEE[i] <- -999
  }
  if((Peaches14$DoY[i] >= 270)&&(Peaches14$Ustar[i] < ths_4)){
    Peaches14$NEE[i] <- -999
  }
}

您不需要 for 循环。例如,您的第一个 for 循环可以替换为 :

badValues <- with(Peaches13,
                (((DoY < 90)&(Ustar < ths_1)) | 
                ((DoY < 180)&(DoY >= 90)&(Ustar < ths_2)) | 
                ((DoY < 270)&(DoY >= 180)&(Ustar < ths_3)) | 
                ((DoY >= 270)&(Ustar < ths_4)) ) )

Peaches13$NEE[badValues] <- -999

这样会更快。你也可以走 dplyr 路线,如:

library(dplyr)
df <- mutate(Peaches13, NEE = ifelse(badValues , -999, NEE))