Присвоение значений в столбце децилям, если разрывы не являются уникальными - PullRequest
0 голосов
/ 21 декабря 2018

Предположим, что у меня есть вектор с 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)

или

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

и т. Д... Все они допустимы при условии, что в первом дециле есть два 0, два во втором, два в третьем, два в четвертом и т. Д. И т. Д., Так что независимо от того, какой 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

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

1 Ответ

0 голосов
/ 21 декабря 2018

Попробуйте:

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(...).

...