过滤多个R data.table列以消除异常值
我想消除高于或低于2个标准差的离群值,对于许多具有类似名称的变量(太多,无法在代码中单独指定)过滤多个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
库(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]