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

时间:2018-05-08 11:51:23

标签: r lapply desctools

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

每列中有异常值的一些数据。所以我想删除100中的值-100V1,但也要删除数据中的整行。同时删除列80中的值-80V2 - 随后也删除该行。

    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列。

1 个答案:

答案 0 :(得分:2)

您无法替换trimdata中的值,因为函数Trim会删除元素,并且您将失去替换所需的长度相等。

这是一个例子:

x <- rnorm(10)
length(x)
[1] 10
length(Trim(x, trim=0.1))
[1] 8

Trim功能之前,您只有8个元素后才有10个元素。

在您的示例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))),]