2017-02-20 14 views
0

Учитывая следующие данные.фаммы, я хочу иметь порядок «чисел» для каждой группы.dplyr с order() производит неправильный заказ

df 
    group  numbers 
1  A -0.80097537 
2  B -0.69498701 
3  C 0.55627105 
4  D -0.05810593 
5  A -1.41748489 
6  B 0.30198594 
7  C 1.11918243 
8  D 0.02595183 
9  A 1.74417489 
10  B 0.42435785 
11  C 0.75889049 
12  D -2.21025222 
13  A 0.57149543 
14  B 0.77944238 
15  C 3.04021182 
16  D -0.14157181 
17  A -0.29213733 
18  B -1.00858701 
19  C 1.49959112 
20  D -0.57532183 

structure(list(group = structure(c(1L, 2L, 3L, 4L, 1L, 2L, 3L, 
4L, 1L, 2L, 3L, 4L, 1L, 2L, 3L, 4L, 1L, 2L, 3L, 4L), class = "factor", .Label = c("A", 
"B", "C", "D")), numbers = c(-0.800975371801324, -0.694987011133934, 
0.556271051640264, -0.0581059266921911, -1.41748489222262, 0.301985943949874, 
1.11918243487368, 0.0259518302570701, 1.74417489077084, 0.424357848275249, 
0.758890492984891, -2.2102522179535, 0.571495432426037, 0.779442380219119, 
3.04021182328692, -0.141571814386413, -0.292137333159453, -1.00858701158259, 
1.49959111842538, -0.575321833031783)), .Names = c("group", "numbers" 
), row.names = c(NA, -20L), class = "data.frame") 

Как-то для группы D порядка неправилен:

df %>% 
group_by(group) %>% 
mutate(x=order(numbers)) %>% 
arrange(group, x) 

Source: local data frame [20 x 3] 
Groups: group [4] 

    group  numbers  x 
    <fctr>  <dbl> <int> 
1  A -1.41748489  1 
2  A -0.80097537  2 
3  A -0.29213733  3 
4  A 0.57149543  4 
5  A 1.74417489  5 
6  B 0.30198594  1 
7  B 0.42435785  2 
8  B 0.77944238  3 
9  B -1.00858701  4 
10  B -0.69498701  5 
11  C 0.55627105  1 
12  C 0.75889049  2 
13  C 1.11918243  3 
14  C 1.49959112  4 
15  C 3.04021182  5 
16  D -0.14157181  1 
17  D -0.57532183  2 
18  D -0.05810593  3 
19  D -2.21025222  4 
20  D 0.02595183  5 

Так конкретно порядок линии 19 является неправильным. Любая идея о моем заблуждении?

+0

Параметр 'ДФ%>% group_by (группа)%>% договоритесь (группа, цифры)' дает правильный выход. Вы можете использовать 'dense_rank' вместо' order', т. Е. 'Df%>% group_by (group)%>% mutate (x = dense_rank (числа))%>% аранжировать (group, x)' – akrun

+0

Но почему заказ и dense_rank давая разные результаты? – c0bra

+0

Просто сделайте это 'df%>% group_by (group)%>% mutate (x = order (order (numbers)))%>% arr (group, x)' – akrun

ответ

1

order отдающий свои функции. Здесь нам нужно rank

library(tidyverse) 
df %>% 
    group_by(group) %>% 
    mutate(x=dense_rank(numbers)) %>% 
    arrange(group, x) 
+1

[rank-and-order-in-r] (http://stackoverflow.com/questions/12289224/rank-and-order-in-r) помог мне понять. Простой «ранг» из R тоже кажется достаточным. – c0bra

+0

@ c0bra Да, это правда, но в случае связей, тогда 'rank' перейдет в режим по умолчанию – akrun