按 r 中的精确数字序列对数据集进行排序

order dataset by exact numeric sequence in r

我有,我认为这是一个非常简单的问题,但无法弄清楚或无法在网上找到确切的问题。我想按 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

我更愿意在 dplyr 中使用 arrange 函数,但会采用任何解决方案。我相信我应该创建一个向量 v<-c(1,2,3,4) 并使用 %in% 对此进行排序,但我不确定如何进行。像这样的东西我认为只是订购 1,1,1 这不是我想要的。 感谢任何帮助,谢谢。

我们可以创建一个按 'id'、'time' 分组的序列列,然后根据 'ind' 执行 arrange,然后使用 [=13 删除该列=]

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

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

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