Процентиль в списке

У меня есть следующий список (h):

> h
[[1]]
[1] 0.9613971

[[2]]
[1] 0.9705882

[[3]]
[1] 0.9503676

[[4]]
[1] 0.9632353

[[5]]
[1] 0.9779412

[[6]]
[1] 0.9852941

[[7]]
[1] 0.9852941

[[8]]
[1] 0.9816176

Я хотел бы добавить новый столбец, который будет вычислять процентиль каждого числа в списке. Я пытался использовать следующее, и я получаю ошибки:

perc.rank <- function(x, xo)  length(x[x <= xo])/length(x)*100


perc.rank <- function(x) trunc(rank(x))/length(x)

trunc(rank(h))/length(h)

Кроме того, я хотел бы знать такое число, как 0,9503676 (третье число) или его число (3), как я могу узнать, каков его процентиль?


person Avi    schedule 23.09.2015    source источник
comment
Ваши данные должны быть в списке? Dataframe или datatable могут быть проще в работе.   -  person Heroka    schedule 23.09.2015
comment
Привет, Heroka, данные могут быть преобразованы в другой тип структуры данных, например в фрейм данных. Однако его источником является список, поэтому будет хорошо остаться в списке. Но, как я уже сказал, dataframe достаточно хорош.   -  person Avi    schedule 23.09.2015
comment
Вы должны предоставить структуру элементов списка. Здесь они выглядят как vector, у которых нет столбцов.   -  person Alex W    schedule 24.09.2015


Ответы (3)


Вы можете сделать это более эффективно, сначала преобразовав свой список в вектор следующим образом:

h <- unlist(h)

Затем создайте функцию для поиска процентиля, что вы можете легко сделать, создав эмпирическую функцию cdf для своего списка следующим образом:

perc.rank <- ecdf(h)

Чтобы найти процентиль для любого числа, например третьего числа, выполните следующие действия:

perc.rank(0.9503676)

Это будет работать, даже если номер не в вашем списке. например. perc.rank(0,91) должен дать вам процентиль для 0,91, и вы также можете передать несколько чисел в функцию, например perc.rank(c(0,950,0,913,0,6))

person FelixNNelson    schedule 23.09.2015
comment
Спасибо, ФеликсННельсон. Если у меня есть номер (позиция) в списке (например, 3), как я могу узнать, каков процентиль этого числа (позиции)? - person Avi; 23.09.2015
comment
@Avi Предполагая, что числовая позиция равна 3, а ваш список находится в переменной с именем h, тогда, чтобы получить процентиль 3-го элемента h, выполните perc.rank(h[[3]]). - person FelixNNelson; 23.09.2015

Преобразование в dataframe упростит задачу. Вот одно решение

library(dplyr)
df<-data.frame(x=rnorm(10))
df%>%mutate(percrank=rank(x)/length(x)*100)

             x percrank
1   1.56254900      100
2  -0.52554968       10
3   0.16410991       70
4   0.95150575       80
5   0.01960002       60
6  -0.22860395       30
7   1.43025012       90
8  -0.15836126       40
9  -0.01150753       50
10 -0.39064474       20
person Ananta    schedule 23.09.2015
comment
Вместо этого выполните df‹-data.frame(x=unlist(h)) - person bramtayl; 24.09.2015

Это добавляет два элемента списка к текущему списку h.

Второй элемент списка — это процентиль, который у вас есть.

Третий элемент списка — это порядковый номер ранга.

h <- list(.9613971, .9705882, .9503676, .9632353, .9779412, .9852941, .9852941, .9816176)

# create percentiles
rnk1 <- rank(unlist(h)) / length(h)

# ordinal rank
rnk2 <- rank(unlist(rnk1))

# combine the original lists with the two additional elements
res <- mapply(c, h, rnk1, rnk2, SIMPLIFY=FALSE)
res
[[1]]
[1] 0.9613971 0.2500000 2.0000000

[[2]]
[1] 0.9705882 0.5000000 4.0000000

[[3]]
[1] 0.9503676 0.1250000 1.0000000

[[4]]
[1] 0.9632353 0.3750000 3.0000000

[[5]]
[1] 0.9779412 0.6250000 5.0000000

[[6]]
[1] 0.9852941 0.9375000 7.5000000

[[7]]
[1] 0.9852941 0.9375000 7.5000000

[[8]]
[1] 0.9816176 0.7500000 6.0000000

Функция поиска по порядковому номеру

perc.rank <- function(x, xo) {
  x[[match(xo, sapply(x, "[[", 1))]]
}

perc.rank(res, .9779412)   
[1] 0.9779412 0.6250000 5.0000000

Что показывает, что .9779412 занимает 5-е место.

person Whitebeard    schedule 23.09.2015