Как ранжировать столбец с условием - PullRequest
0 голосов
/ 28 сентября 2018

У меня есть фрейм данных:

dt <- read.table(text = "
1 390 
1 366
1 276 
1 112 
2 97
2 198  
2 400  
2 402
3 110
3 625
4 137
4 49
4 9
4 578 ")

Первый столбец - индекс, а второй - расстояние.

Я хочу добавить колонку для ранжирования расстояния по индексу в порядке убывания (наибольшее расстояние будет занимать первое место)

Результат будет:

dt <- read.table(text = "
1 390 1
1 66  4
1 276 2
1 112 3
2 97  4
2 198 3 
2 300 2
2 402 1
3 110 2
3 625 1
4 137 2
4 49  3
4 9   4
4 578 1")

Ответы [ 3 ]

0 голосов
/ 28 сентября 2018

Другой базовый подход R

> dt$Rank <- unlist(tapply(-dt$V2, dt$V1, rank))

Тидиверс-решение

dt %>% 
  group_by(V1) %>% 
  mutate(Rank=rank(-V2))
0 голосов
/ 13 октября 2018

Вы можете group, arrange и rownumber.Результат немного проще для глаз, чем простой rank, я думаю, и поэтому стоит дополнительного шага.

dt %>% 
  group_by(V1) %>% 
  arrange(V1,desc(V2)) %>% 
  mutate(rank = row_number())

# A tibble: 14 x 3
# Groups:   V1 [4]
      V1    V2  rank
   <int> <int> <int>
 1     1   390     1
 2     1   366     2
 3     1   276     3
 4     1   112     4
 5     2   402     1
 6     2   400     2
 7     2   198     3
 8     2    97     4
 9     3   625     1
10     3   110     2
11     4   578     1
12     4   137     2
13     4    49     3
14     4     9     4

Зашифрованная альтернатива - min_rank

dt %>% 
  group_by(V1) %>% 
  mutate(min_rank(desc(V2)) )
0 голосов
/ 28 сентября 2018
transform(dt,s = ave(-V2,V1,FUN = rank))
   V1  V2 s
1   1 390 1
2   1  66 4
3   1 276 2
4   1 112 3
5   2  97 4
6   2 198 3
7   2 300 2
8   2 402 1
9   3 110 2
10  3 625 1
11  4 137 2
12  4  49 3
13  4   9 4
14  4 578 1
...