Разделить столбец данных в квантиль без дублирования квантиля для любого значения в R - PullRequest
1 голос
/ 06 февраля 2020

У меня есть фрейм данных, определенный следующим образом:

  structure(list(value = c(1, 1, 2, 2, 2, 2, 2, 3, 4, 5)), class = "data.frame", row.names = c(NA, 
-10L)) 

Я хочу разбить столбец 'value' на квантиль 'n' (скажем, n = 3) так, чтобы любое значение не попадало в 2 квантиль. Например: значение '2' должно получить уникальный квантиль

Я пытался использовать функцию 'ntile', как показано ниже

df1 <- mutate(df,R_rank=ntile(df$value,3))

Результат:

structure(list(value = c(1, 1, 2, 2, 2, 2, 2, 3, 4, 5), R_rank = c(1L, 
1L, 1L, 1L, 2L, 2L, 2L, 3L, 3L, 3L)), class = "data.frame", row.names = c(NA, 
-10L))

Здесь значение ' 2 'попадает в 2 различных квантиля (1 и 2), но я хочу, чтобы любое значение должно попадать в уникальный квантиль.

Как я могу сделать это в R?

Ответы [ 2 ]

2 голосов
/ 06 февраля 2020

Возможно, вы можете использовать cut

cut(df$value, 3, labels = FALSE)
#[1] 1 1 1 1 1 1 1 2 3 3

, где

df$value #is
#[1] 1 1 2 2 2 2 2 3 4 5

Таким образом, 1-2 попадают в группу 1, 3 попадают в группу 2 и 4-5 в группу 3.

2 голосов
/ 06 февраля 2020

Возможно, решение состоит в том, чтобы установить quantile аргумент type в значение, отличное от значения по умолчанию type = 7.

n <- 3

q5 <- quantile(V, probs = seq(0, 1, length.out = n + 1), type = 5)
q6 <- quantile(V, probs = seq(0, 1, length.out = n + 1), type = 6)
q8 <- quantile(V, probs = seq(0, 1, length.out = n + 1), type = 8)
q9 <- quantile(V, probs = seq(0, 1, length.out = n + 1), type = 9)

И разделить входной вектор:

split(V, findInterval(V, q5))
split(V, findInterval(V, q6))
split(V, findInterval(V, q8))
split(V, findInterval(V, q9))

Приведенные выше инструкции split дают одинаковые результаты. См. ниже.

Значения 5, 6, 8 и 9 были найдены с помощью следующего кода:

sapply(1:9, function(i)
  quantile(V, probs = seq(0, 1, length.out = n + 1), type = i)
)
#          [,1] [,2] [,3] [,4]     [,5]     [,6] [,7]     [,8]     [,9]
#0%           1    1    1    1 1.000000 1.000000    1 1.000000 1.000000
#33.33333%    2    2    2    2 2.000000 2.000000    2 2.000000 2.000000
#66.66667%    2    2    2    2 2.166667 2.333333    2 2.222222 2.208333
#100%         5    5    5    5 5.000000 5.000000    5 5.000000 5.000000

Поскольку столбцы 5, 6, 8 и 9 имеют квантили 2/3, отличные от 2 эти типы могут быть выбраны для решения вопроса.

Квантили 2/3 находятся между 2 и 3, поэтому инструкции split выводят один и тот же список.

...