按r中的精确数字顺序排序数据集

时间:2016-07-18 11:35:42

标签: r sorting dplyr sequence

我有,我认为这是一个非常简单的问题,但无法弄清楚或在网上找到确切的问题。我想按id和时间1:4对我的数据集进行排序,以便它在序列1,2,3,4而不是1,1,1,2,2,2,3,4中。见例:

dff <- data.frame (id=c(1,1,1,1,1,1,1,1,2,2,2,3),
                      time=c(1,1,2,2,3,3,4,4,1,1,2,1))
    R>dff
       id time
    1   1    1
    2   1    1
    3   1    2
    4   1    2
    5   1    3
    6   1    3
    7   1    4
    8   1    4
    9   2    1
    10  2    1
    11  2    2
    12  3    1

我希望生成的数据集按如下方式排序:

    R>dff
   id time
1   1    1
2   1    2
3   1    3
4   1    4
5   1    1
6   1    2
7   1    3
8   1    4
9   2    1
10  2    2
11  2    1
12  3    1

我最好在arrange中使用dplyr函数,但会采取任何解决方案。我相信我应该创建一个向量v&lt; -c(1,2,3,4)并使用%in%进行排序,但我不确定如何。这样的事情我认为只是订单1,1,1这不是我想要的。 任何帮助表示感谢,谢谢。

2 个答案:

答案 0 :(得分:5)

我们可以根据&#39; id&#39;,&#39; time&#39;创建一个序列列,然后根据&#39; ind&#39;进行arrange。然后使用select

删除该列
library(dplyr)
dff %>%
    group_by(id, time) %>% 
    mutate(ind = row_number()) %>%
    arrange(id, ind) %>%
    select(-ind)
#     id  time
#   <dbl> <dbl>
#1      1     1
#2      1     2
#3      1     3
#4      1     4
#5      1     1
#6      1     2
#7      1     3
#8      1     4
#9      2     1
#10     2     2
#11     2     1
#12     3     1

如果我们使用base R,则以下单行将用于此目的

dff[order(dff$id, with(dff, ave(time, id, time, FUN = seq_along))),]
#   id time
#1   1    1
#3   1    2
#5   1    3
#7   1    4
#2   1    1
#4   1    2
#6   1    3
#8   1    4
#9   2    1
#11  2    2
#10  2    1
#12  3    1

答案 1 :(得分:4)

@akrun答案的轻微构建。 使用dplyr版本0.4.3 我认为在安排之前需要使用 ungroup() - 因为它按id和amp分组时间。 好像它首先按照组的级别进行排序。然后是安排中指定的列。

library(dplyr)
dff %>%
    group_by(id, time) %>% 
    mutate(ind = row_number()) %>%
    ungroup() %>%
    arrange(id, ind) %>%
    select(-ind)