Обрезать данные, используя lapply для удаления выбросов - PullRequest
0 голосов
/ 08 мая 2018

Я пытаюсь использовать 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)

Приведенный выше код применяет функцию ко всем столбцам (исключая крайние значения в столбце 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 голосов
/ 08 мая 2018

Вы не можете заменить значения в 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))),]
...