Обрезать данные, используя lapply для удаления выбросов

Я пытаюсь использовать lapply обрезать некоторые из моих данных. Что я пытаюсь сделать, это обрезать столбцы 2:4 (удаляя выбросы или экстремальные значения), но также удаляйте строки в столбцах.

Некоторые данные с выбросами в каждом столбце. Поэтому я хочу удалить значения 100 а также -100 в V1 но также удалить всю строку в данных. Также удаление значений 80 а также -80 в столбце V2 - впоследствии удаляя этот ряд также.

    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)

Приведенный выше код применяет функцию ко всем столбцам (удаляя экстремальные значения в столбце идентификатора)

Этот код:

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 ответ

Решение

Вы не можете заменить значения в 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 в выводе, вы можете удалить все эти строки из вашего dataframe trimdata, как это:

trimdata[-unique(unlist(lapply(trim_out, attributes))),]
Другие вопросы по тегам