Trim 数据使用 lapply 去除异常值
Trim data using lapply to remove outliers
我正在尝试使用 lapply
来 trim 我的一些数据。我想做的是 trim 列 2:4
(删除异常值或极值)但也删除列中的行。
一些数据在每一列中都有异常值。所以我想删除 100
和 -100
中的 V1
值,但也删除数据中的整行。同时删除列 V2
中的值 80
和 -80
- 随后也删除该行。
trimdata <- NULL
trimdata$ID <- seq.int(102)
trimdata$V1 <- c(rnorm(100), 100, -100)
trimdata$V2 <- c(rnorm(100), 80, -80)
trimdata$V3 <- c(rnorm(100), 120, -120)
trimdata <- as.data.frame(trimdata)
library(DescTools)
trimdata <- lapply(trimdata, function(x) Trim(x, trim = 0.01))
trimdata <- as.data.frame(trimdata)
以上代码将函数应用于所有列(删除 ID 列中的极值)
此代码:
trimdata[2:4] <- lapply(trimdata[2:4], function(x) Trim(x, trim = 0.01))
Returns下面的错误
Error in `[<-.data.frame`(`*tmp*`, 2:4, value = list(V1 = c(0.424725933773568, :
replacement element 1 has 98 rows, need 100
所以我尝试 trim 基于列 2:4 但也将其应用于第 1 列。
您不能替换 trimdata
中的值,因为函数 Trim
会删除元素并且您会失去替换所需的长度相等性。
举个例子:
x <- rnorm(10)
length(x)
[1] 10
length(Trim(x, trim=0.1))
[1] 8
在 Trim
函数之前你有 10 个元素,之后只有 8 个。
在您的示例中 Trim
删除了 2 个元素,因此您在错误中有以下描述:
replacement element 1 has 98 rows, need 100
来自 Trim
文档:
A symmetrically trimmed vector x with a fraction of trim observations
(resp. the given number) deleted from each end will be returned.
在您的示例中,每列的两行被修剪掉了。如您所见,每列的行不同:
trim_out<-lapply(trimdata[2:4], function(x) Trim(x, trim = 0.01))
lapply(trim_out, attributes)
$V1
$V1$trim
[1] 56 57
$V2
$V2$trim
[1] 63 47
$V3
$V3$trim
[1] 90 74
如果你想要一个干净的 data.frame 输出,你可以从你的数据框中删除所有这些行 trimdata
,像这样:
trimdata[-unique(unlist(lapply(trim_out, attributes))),]
我正在尝试使用 lapply
来 trim 我的一些数据。我想做的是 trim 列 2:4
(删除异常值或极值)但也删除列中的行。
一些数据在每一列中都有异常值。所以我想删除 100
和 -100
中的 V1
值,但也删除数据中的整行。同时删除列 V2
中的值 80
和 -80
- 随后也删除该行。
trimdata <- NULL
trimdata$ID <- seq.int(102)
trimdata$V1 <- c(rnorm(100), 100, -100)
trimdata$V2 <- c(rnorm(100), 80, -80)
trimdata$V3 <- c(rnorm(100), 120, -120)
trimdata <- as.data.frame(trimdata)
library(DescTools)
trimdata <- lapply(trimdata, function(x) Trim(x, trim = 0.01))
trimdata <- as.data.frame(trimdata)
以上代码将函数应用于所有列(删除 ID 列中的极值)
此代码:
trimdata[2:4] <- lapply(trimdata[2:4], function(x) Trim(x, trim = 0.01))
Returns下面的错误
Error in `[<-.data.frame`(`*tmp*`, 2:4, value = list(V1 = c(0.424725933773568, :
replacement element 1 has 98 rows, need 100
所以我尝试 trim 基于列 2:4 但也将其应用于第 1 列。
您不能替换 trimdata
中的值,因为函数 Trim
会删除元素并且您会失去替换所需的长度相等性。
举个例子:
x <- rnorm(10)
length(x)
[1] 10
length(Trim(x, trim=0.1))
[1] 8
在 Trim
函数之前你有 10 个元素,之后只有 8 个。
在您的示例中 Trim
删除了 2 个元素,因此您在错误中有以下描述:
replacement element 1 has 98 rows, need 100
来自 Trim
文档:
A symmetrically trimmed vector x with a fraction of trim observations (resp. the given number) deleted from each end will be returned.
在您的示例中,每列的两行被修剪掉了。如您所见,每列的行不同:
trim_out<-lapply(trimdata[2:4], function(x) Trim(x, trim = 0.01))
lapply(trim_out, attributes)
$V1
$V1$trim
[1] 56 57
$V2
$V2$trim
[1] 63 47
$V3
$V3$trim
[1] 90 74
如果你想要一个干净的 data.frame 输出,你可以从你的数据框中删除所有这些行 trimdata
,像这样:
trimdata[-unique(unlist(lapply(trim_out, attributes))),]