Обрезать данные, используя 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))),]