Замена связанного ранга их средним - PullRequest
1 голос
/ 09 марта 2020

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

> x
  tags freq.Freq
1    a       740
2    b       722
3    c       722
4    d       541
5    e       525
6    f       525
7    g       525
8    h       326
9    i       296

т.е.

x<- structure(list(tags = c("a", "b", "c", "d", "e", "f", "g", "h", "i"),
 freq.Freq = c(740L, 722L, 722L, 541L, 525L, 525L, 525L, 326L, 296L)), 
class = "data.frame", row.names = c("1", "2", "3", "4", "5", "6", "7", "8", "9"))

Я хотел бы заменить столбец freq.Freq ранжированием каждой буквы в tags. Например, a равно 1, d равно 4, i равно 9. В любом случае, b, c и e, f, g имеют одинаковые ранги. В этих случаях я хотел бы заменить freq.Freq на среднее число «связанных» рангов. Таким образом, желаемый результат:

  tags freq.Freq
1    a       1
2    b       2.5
3    c       2.5
4    d       4
5    e       6
6    f       6
7    g       6
8    h       8
9    i       9

Моя попытка:

library(dplyr)
min_rank(x$freq.Freq)

дает неправильный результат:

9 7 7 6 3 3 3 2 1

Ответы [ 2 ]

3 голосов
/ 09 марта 2020
x %>%
    mutate(rank = match(tags, letters)) %>%
    group_by(freq.Freq) %>%
    mutate(rank = mean(rank)) %>%
    ungroup()

Или базовая версия R, предложенная markus

transform(x, new = ave(match(tags, letters), freq.Freq, FUN = mean))
2 голосов
/ 09 марта 2020

Мы можем просто использовать rank из base R. Метод по умолчанию для ties.method «средний»

x$freq.Freq <- rank(-x$freq.Freq)
x$freq.Freq
#[1] 1.0 2.5 2.5 4.0 6.0 6.0 6.0 8.0 9.0
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...