В базе R на предварительно заказанных данных:
with(df, ave(cumsum(!duplicated(val)) , val, FUN = function(x) x + (length(x) > 1)/length(x)))
[1] 1.000000 2.333333 2.333333 2.333333 3.500000 3.500000 4.000000 5.000000 6.000000
Или та же идея с использованием dplyr
:
library(dplyr)
df %>%
mutate(rk = dense_rank(val)) %>%
group_by(val) %>%
mutate(rk = rk + (n() > 1) / n())
# A tibble: 9 x 3
# Groups: val [6]
grp val rk
<chr> <int> <dbl>
1 sw 2 1
2 sl 4 2.33
3 sl 4 2.33
4 sl 4 2.33
5 sw 6 3.5
6 sw 6 3.5
7 sl 9 4
8 sw 12 5
9 sl 15 6
Данные (слегка измененные, чтобы добавить более одного дубликата ):
df <- structure(list(grp = c("sw", "sl", "sl", "sl", "sw", "sw", "sl",
"sw", "sl"), val = c(2L, 4L, 4L, 4L, 6L, 6L, 9L, 12L, 15L), rk = c(1,
2.5, 2.5, 2.5, 3.5, 3.5, 4, 5, 6)), class = "data.frame", row.names = c("2",
"4", "9", "8", "3", "7", "5", "1", "6"))