Присвоение значений в столбце децилям, когда разрывы не уникальны

Предположим, у меня есть вектор с 1000 числами. Я хочу получить децили этого вектора, а затем найти среднее значение каждого дециля. Однако в этом векторе 215+ нулей. Это означает, что первый и второй разрывы будут равны нулю, поэтому я столкнусь с ошибкой Cut() error - 'breaks' are not unique. Я хочу присвоить 100 нулей первому децилю, еще 100 - второму децилю и последние 15 нулей - третьему децилю. Так что среднее значение первого и второго децилей будет равно нулю. Вот воспроизводимый и более мелкий пример с аналогичной проблемой:

v=c(0, 0, 0, 0, 1, 1, 1, 1, 1, 1, 2, 2, 2, 2, 3, 3, 5, 6, 3, 7)
cut_q10 <- quantile(v, probs = seq(0, 1, 0.1))
v_q10 =cut(v, breaks = cut_q10,labels = FALSE)
#Error in cut.default(v, breaks = cut_q10, labels = FALSE) : 
#  'breaks' are not unique

Я бы хотел получить:

v_q10 = c(1,1,2,2,3,3,4,4,5,5,6,6,7,7,8,8,9,10,9,10)

or

v_q10 = c(2,2,1,1,3,4,4,3,5,5,6,6,7,7,8,8,9,10,9,10)

и т. д. Все они приемлемы, пока есть два нуля в первом дециле, два нуля во втором, две единицы в третьем, две единицы в четвертом и т. д., так что независимо от того, какой v_q10 получается когда я нахожу средства каждого дециля, я достигаю этого:

merged = as.data.frame(cbind(v,v_q10))
merged = merged%>%group_by(v_q10)%>%summarise(means = mean(v))

   v_q10 means
#   <dbl> <dbl>
# 1     1   0  
# 2     2   0  
# 3     3   1  
# 4     4   1  
# 5     5   1  
# 6     6   2  
# 7     7   2  
# 8     8   3  
# 9     9   4  
#10    10   6.5

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


person Elif Cansu Akoğuz    schedule 21.12.2018    source источник
comment
Вы пробовали dplyr::ntile?   -  person tomaz    schedule 21.12.2018


Ответы (1)


Попробуй это:

cut(rank(v, ties = "first"), 10, lab = FALSE)
## [1]  1  1  2  2  3  3  4  4  5  5  6  6  7  7  8  8  9 10  9 10

Альтернативы включают использование ties = "last", использование ties = "random" или использование order(order(v)) вместо rank(...).

person G. Grothendieck    schedule 21.12.2018
comment
спасибо большое, это отлично работает. Мне было интересно еще кое-что. Могу ли я сделать то же самое, если бы мне явно не был задан вектор v, а как фрейм данных каждого значения и его вес рядом с ним, например: `v = data.frame (values ​​= c (0,1,2 , 3,5,6,7), веса = c (4,6,4,3,1,1,1)) - person Elif Cansu Akoğuz; 21.12.2018
comment
Если по весу вы имеете в виду, что это значение должно повторяться такое количество раз, то сначала сформируйте: v <- with(DF, rep(values, weights)) - person G. Grothendieck; 21.12.2018