过滤多个R data.table列以消除异常值

过滤多个R data.table列以消除异常值,r,data.table,outliers,R,Data.table,Outliers,我想消除高于或低于2个标准差的离群值,对于许多具有类似名称的变量(太多,无法在代码中单独指定) 库(data.table) irisdt 2)}] #这部分起作用,但会发生变化 irisdt[,(myCols):=lapply(myCols,function(x){(scale(irisdt[[x]])2)} #如何创建新变量,例如“Sepal.Length.Outlier”? myOutlierCols我想这达到了目标: irisdt[, keep := as.logical(do.ca

我想消除高于或低于2个标准差的离群值,对于许多具有类似名称的变量(太多,无法在代码中单独指定)

库(data.table)
irisdt 2)}]
#这部分起作用,但会发生变化
irisdt[,(myCols):=lapply(myCols,function(x){(scale(irisdt[[x]])<-2 | scale(irisdt[[x]])>2)}
#如何创建新变量,例如“Sepal.Length.Outlier”?

myOutlierCols我想这达到了目标:

irisdt[, keep := 
  as.logical(do.call(pmin, lapply(.SD, function(x) abs(scale(x)) <= 2)))
, .SDcols = myCols]

res = irisdt[(keep), !"keep"]

     Sepal.Length Sepal.Width Petal.Length Petal.Width   Species
  1:          5.1         3.5          1.4         0.2    setosa
  2:          4.9         3.0          1.4         0.2    setosa
  3:          4.7         3.2          1.3         0.2    setosa
  4:          4.6         3.1          1.5         0.2    setosa
  5:          5.0         3.6          1.4         0.2    setosa
 ---                                                            
135:          6.7         3.0          5.2         2.3 virginica
136:          6.3         2.5          5.0         1.9 virginica
137:          6.5         3.0          5.2         2.0 virginica
138:          6.2         3.4          5.4         2.3 virginica
139:          5.9         3.0          5.1         1.8 virginica
irisdt[,keep:=

as.logical(do.call)(pmin,lapply(.SD,function(x)abs(scale(x))我想这达到了目标:

irisdt[, keep := 
  as.logical(do.call(pmin, lapply(.SD, function(x) abs(scale(x)) <= 2)))
, .SDcols = myCols]

res = irisdt[(keep), !"keep"]

     Sepal.Length Sepal.Width Petal.Length Petal.Width   Species
  1:          5.1         3.5          1.4         0.2    setosa
  2:          4.9         3.0          1.4         0.2    setosa
  3:          4.7         3.2          1.3         0.2    setosa
  4:          4.6         3.1          1.5         0.2    setosa
  5:          5.0         3.6          1.4         0.2    setosa
 ---                                                            
135:          6.7         3.0          5.2         2.3 virginica
136:          6.3         2.5          5.0         1.9 virginica
137:          6.5         3.0          5.2         2.0 virginica
138:          6.2         3.4          5.4         2.3 virginica
139:          5.9         3.0          5.1         1.8 virginica
irisdt[,keep:=

as.logical(do.call)(pmin,lappy(.SD,function(x)abs(scale(x))感谢您提供了非常简洁明了的答案。它比我所采用的方法要好得多!我正试图修改它,用NA替换所有值abs(scale(x))>=2。以下是我的尝试(不起作用):irisdt[,(myCols):=lappy(.SD,function(x)(if(as.logical)(do.call(pmin,lappy(.SD,function(x)abs(scale(x))这也不能用来替换单元格:irisdt[,(myCols):=lappy(.SD,function(x){if(abs(scale(x))@KayleSawyer我不确定我是否明白。如果你只是使用
lappy
部分,它应该给出一个列列表(而不是折叠为一列)。您可以将函数更改为类似于
replace(x,condition,NA)
{is.NA(x)的形式来解释它,谢谢。replace()函数很棒。这是非常有用的代码,我可以修改。感谢您提供了非常简洁明了的答案。这比我使用的方法要好得多!我正在尝试修改它以替换所有值(scale(x))>=2和NA。这是我的尝试(不起作用):irisdt[,(myCols):=lappy(.SD,函数(x)(if)(as.logical)(do.call)(pmin,lappy(.SD,函数(x)abs(scale(x)),这也不能替代单元格:irisdt[,(myCols):=lappy(.SD,函数(x){if(abs)(scale(x))@KayleSawyer我不确定我是否理解。如果你只是使用
lappy
部分,它应该会给出一个列列表(而不是折叠成一列)。你可以将函数更改为类似
replace(x,condition,NA)
{is.NA(x),这就解释了它,谢谢。replace()函数很棒。我可以修改这段非常有用的代码。
irisdt[, keep := 
  as.logical(do.call(pmin, lapply(.SD, function(x) abs(scale(x)) <= 2)))
, .SDcols = myCols]

res = irisdt[(keep), !"keep"]

     Sepal.Length Sepal.Width Petal.Length Petal.Width   Species
  1:          5.1         3.5          1.4         0.2    setosa
  2:          4.9         3.0          1.4         0.2    setosa
  3:          4.7         3.2          1.3         0.2    setosa
  4:          4.6         3.1          1.5         0.2    setosa
  5:          5.0         3.6          1.4         0.2    setosa
 ---                                                            
135:          6.7         3.0          5.2         2.3 virginica
136:          6.3         2.5          5.0         1.9 virginica
137:          6.5         3.0          5.2         2.0 virginica
138:          6.2         3.4          5.4         2.3 virginica
139:          5.9         3.0          5.1         1.8 virginica
library(data.table)

mynewCols = paste0(myCols,"_outly")
irisdt[, (mynewCols) := 
  lapply(.SD, function(x) replace(x, abs(scale(x)) <= 2, NA))
, .SDcols = myCols]