如何从数据框中删除超出变量特定范围的记录?[R]

A. *_*tam 5 r outliers

我有一个数据帧和一个预测模型,我想应用于数据.但是,我想过滤掉模型可能不适用的记录.为此,我有另一个数据帧,其中包含每个变量在训练数据中观察到的最小值和最大值.我想从我的新数据中删除那些一个或多个值超出指定范围的记录.

为了使我的问题清楚,这就是我的数据可能是这样的:

  id   x       y     
 ---- ---- --------- 
   1    2     30521  
   2   -1      1835  
   3    5     25939  
   4    4   1000000  
Run Code Online (Sandbox Code Playgroud)

这是我的第二张桌子,包括分钟和最大值,看起来像:

  var   min    max   
 ----- ----- ------- 
  x       1       5  
  y       0   99999  
Run Code Online (Sandbox Code Playgroud)

在这个例子中,我想在我的数据中标记以下记录:2(低于x的最小值)和4(高于y的最大值).

我怎么能在R中轻松做到这一点?我有预感,有一些聪明的dplyr代码可以完成这项任务,但我不知道它会是什么样子.

age*_*nis 1

你的数据是这样的:

df = data.frame(x=c(2,-1,5,4,7,8), y=c(30521, 1800, 25000,1000000, -5, 10))
limits = data.frame("var"=c("x", "y"), min=c(1,0), max=c(5,99999))
Run Code Online (Sandbox Code Playgroud)

您可以将sweep函数与运算符一起使用'>''<'非常简单!

sweep(df, 2, limits[, 2], FUN='>') & sweep(df, 2, limits[, 3], FUN='<')
####          x     y
#### [1,]  TRUE  TRUE
#### [2,] FALSE  TRUE
#### [3,] FALSE FALSE
#### [4,]  TRUE FALSE
#### [5,] FALSE FALSE
#### [6,] FALSE  TRUE
Run Code Online (Sandbox Code Playgroud)

TRUE 位置告诉您要为每个变量保留哪些观察结果。它应该适用于任意数量的变量

之后,如果您需要全局标志(至少在一列中的标志),您可以运行这个简单的行(res 是之前的输出)

apply(res, 1, all)
#### [1]  TRUE FALSE FALSE FALSE FALSE FALSE
Run Code Online (Sandbox Code Playgroud)