R语言 使用 lapply 修剪数据以删除异常值



我正在尝试使用lapply来修剪我的一些数据。我正在尝试做的是修剪列2:4(删除异常值或极值),但也删除列中的行。

每列中带有异常值的一些数据。所以我想删除V1100-100的值,但也要删除数据中的整行。还删除第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))

返回以下错误

Error in `[<-.data.frame`(`*tmp*`, 2:4, value = list(V1 = c(0.424725933773568,  : 
replacement element 1 has 98 rows, need 100

所以我正在尝试根据第 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 个元素,因此您在错误中有以下描述:

替换元素 1 有 98 行,需要 100

Trim文档中:

具有一小部分修剪观测值的对称修剪向量 x (或给定的号码)从两端删除将被返回。

在您的示例中,每列两行被剪裁掉。如您所见,每列的行都不同:

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))),]

相关内容

  • 没有找到相关文章

最新更新