Функция, показывающая, какому квартильному числу принадлежат данные в большом списке элементов - PullRequest
0 голосов
/ 21 сентября 2018

Я экспериментирую с функцией квантиля в независимых фреймах данных.

Очень простой пример для иллюстрации моего случая:

получить квартили

quantile(x <- rnorm(1001))

0%          25%          50%          75%         100% 
-2.930587810 -0.687108751  0.004405246  0.644589258  2.839597566 

#subdivide quantile results in 5 independent results (data frames) For example:

list2env(setNames(as.list(quantile(x <-   rnorm(1001))),paste0("Q",1:5)),.GlobalEnv)

Итак, теперьв новом столбце, который я имею рядом с результатами квартильных данных, сгруппированными в соответствующие квартильные числа Q0, Q1, Q2, Q3, Q4.

Теперь я хотел бы применить то же самое к «Большому списку»(large_list) с более чем 400 элементами на нем, так что я думаю, мне нужен другой подход к нему (функция), чтобы применить его глобально к 400 элементам моего списка.

Здесь мне нужна помощьсообщества, это мой подход:

#Read all elements of the list in the environment,create a new column to be named, 
# Elementname.Quartilenumber that contains which 
# Q (0,1,2,3,4) number the data belongs to.

Qnumber <- function(x) {
element_name <- stringi::stri_extract(names(x)[1], regex = "^[A-Z]+")
element_name <- paste0(element_name, ".Quartilenumber")
column_names <- c(names(x), stock_name)
x$quartile <- quantile(large_list$.)
x <- setNames(x, column_names)
return(x) 

Любая помощь будет очень ценится.

Большое спасибо.

1 Ответ

0 голосов
/ 21 сентября 2018

Для каждого элемента в вашем списке сделайте следующее:

  1. рассчитайте квантили, как вы это сделали: qx <- quantiles(x)

  2. посчитайте, сколько из этих значений равняется >= каждый элемент данных sum(qx >= x[i]);это соответствует квартильному числу во всех, кроме одного случая, - максимальному значению (вы получаете NA для этого, потому что сумма равна 0)

  3. установите квартиль для максимального значенияквартиль к четвертому квартилю ('Q4').

Вот некоторые фальшивые данные (список фреймов данных):

list.1 <- list()
for (i in 1:5) {
    list.1[[i]] <- data.frame('elem_data'=rnorm(10))
}

По спискуdata.frames и добавить столбец квартиля.

qnames <- c('Q1','Q2','Q3','Q4')
for (i in 1:5) {
    qx <- quantile(list.1[[i]]$elem_data)
    list.1[[i]]$qnum <- sapply(list.1[[i]]$elem_data, function(x) qnames[sum(x >= qx)])
    list.1[[i]]$qnum[is.na(list.1[[i]]$qnum)] <- qnames[4]
}

Я попытался сделать это со списком из 1000 data.frames с 1000 элементами данных каждый, и это заняло около 2,5 секунд (на MacBook Air в середине 2013 года).

...