Как найти относительную частоту значений больше, чем x, x + 10000 в большом наборе данных? - PullRequest
0 голосов
/ 04 ноября 2019

У меня есть набор данных с 1 миллионом строк и 10 столбцами, где каждое наблюдение может иметь значение от 0 до 100 миллионов (верхняя граница не установлена, но она не может переходить в бесконечность). Мне нужно найти относительную частоту значений больше, чем х, х + 10000. Фрейм данных выглядит примерно так:

     Event1       Event2    Event3...

1     0.00        10320.21   1400.0

2     143212.31   0.00       0.00

3     0.00        32573.77   0.00

4     0.00        0.00       3582774.87

5     3403.14     0.00       14754.50

...

Я создал код, который показывает мне желаемые результаты, но потребовались бы часы, чтобы ввести все необходимые значения.

relative.percent <- function(x, n){ 100*length((which(x > n))) / length(x) }

relative.percent(results$Event1,10000)

Я хочу получить относительный процент значений больше 0 со взаимозаменяемым интервалом, скажем, 10000.

Так, чтобы вывод представлял собой список или таблицу, в которой показывался бы процент значений из столбца (событие 1, Событие 2 ...), которые больше 0, и значения, которые больше, чем 10000, и относительный процент значений, больше, чем 20000, и так далее, все они ведут к максимальному значению набора данных (который может быть 100 миллионов)

1 Ответ

0 голосов
/ 04 ноября 2019

Хорошо, так что, если я вас правильно понял, вы хотите узнать какое-то эмпирическое кумулятивное распределение. Вы должны посмотреть, как использовать приложение, это сделает вашу жизнь намного проще.

Приведенный ниже код требует некоторого времени для изучения, но тогда ваш поиск должен быть относительно быстрым. Таким образом, если вы хотите, чтобы процент значений, которые LESS или EQUAL запрашивали для определенного столбца, вы просто передаете вектор значений, а затем возвращаете вектор процентов. Если вы хотите подготовить, есть пример ниже.

Надеюсь, это поможет.

library(dplyr) ## just for %>% 
test <- data.frame(x1=rpois(100,n = 10**7),x2=rpois(100,n = 10**7),
                   x3=rpois(100,n = 10**7),x4=rpois(100,n = 10**7),
                   x5=rpois(100,n = 10**7),x6=rpois(100,n = 10**7),
                   x7=rpois(100,n = 10**7),x8=rpois(100,n = 10**7),
                   x9=rpois(100,n = 10**7),x10=rpois(100,n = 10**7)
                   )
system.time({
  get_function <- apply(test,2,ecdf)
  ## learning fucntion 10 million instances, 10 rows
  ##user  system elapsed 
  ##4.38    0.73    5.16 
})

evaluate <- function(query,funct=get_function){
  lapply(1:length(get_function),function(i){
    funct[[i]](query[i])
  }) %>% unlist()
}

query_1 <- rep(-10,10) ## never appear, percentage should be 0
query_2 <- rep(100,10) ## around 0.5
query_3 <- rep(10000,10) ## 1 or close to 1



evaluate(query_1)
# [1] 0 0 0 0 0 0 0 0 0 0
evaluate(query_2)
# [1] 0.526348 0.526626 0.526714 0.526150 0.527456 0.526217 0.525491 0.526729 0.526429 0.525340
evaluate(query_3)
# [1] 1 1 1 1 1 1 1 1 1 1

## get percentage of values between 95 and 100
query_4 <- rep(95,10)
evaluate(query_2) - evaluate(query_4)
#[1] 0.1954705 0.1952166 0.1952291 0.1954930 0.1955171 0.1954126 0.1952673 0.1953782 0.1952068 0.1953201
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...