Расчет ранга столбца с дублирующимися значениями по категории - PullRequest
0 голосов
/ 27 декабря 2018

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

Data Frame - 

Category    Value
A       0.105
A       0.104
A       0
A       0
A       0
B       0.206
B       0.105
B       0.104
B       0
B       0

Что мне нужно, это -

    Category    Value   Rank 
    A            0.105  1
    A            0.104  2
    A            0      3
    A            0      4
    A            0      5
    B            0.206  1
    B            0.105  2
    B            0.104  3
    B            0      4
    B            0      5

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

df - мой фрейм данных

df$newRank <- with(df, ave(Category, Category, Value, FUN = seq_along))

Ответы [ 2 ]

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

с использованием data.table:

dt=as.data.table(df)
dt=dt[order(Category,-Value),]
dt[,`:=`(Rank=seq_along(Value)),by=Category]
0 голосов
/ 27 декабря 2018

dplyr::row_number() - это функция ранжирования, которая может давать равные числа различным рангам.Например, row_number(c(1, 1, 2, 2, 3)) будет производить 1 2 3 4 5.Тем не менее, он дает минимальное число ранг 1, второе минимальное число ранг 2 и так далее.Итак, в вашем случае, я делаю преобразование, чтобы инвертировать величину, то есть сделать наименьшее число наибольшим до ранжирования.

library(dplyr)

df %>% group_by(Category) %>%
       mutate(Rank = row_number(max(Value) - Value))

# # A tibble: 10 x 3
# # Groups:   Category [2]
#    Category Value  Rank
#    <fct>    <dbl> <int>
#  1 A        0.105     1
#  2 A        0.104     2
#  3 A        0         3
#  4 A        0         4
#  5 A        0         5
#  6 B        0.206     1
#  7 B        0.105     2
#  8 B        0.104     3
#  9 B        0         4
# 10 B        0         5

with() или within() Метод

within(df, Rank <- ave(Value, Category, FUN = function(x){
  return(dplyr::row_number(max(x) - x))
}))

(Пожалуйста, посмотрите разницу между with() и within() в документе R)


Данные

df <- structure(list(Category = structure(c(1L, 1L, 1L, 1L, 1L, 2L, 2L, 2L, 2L, 2L),
                .Label = c("A", "B"), class = "factor"),
                Value = c(0.105, 0.104, 0, 0, 0, 0.206, 0.105, 0.104, 0, 0)),
                class = "data.frame", row.names = c(NA, -10L))
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...