我有,我认为这是一个非常简单的问题,但无法弄清楚或在网上找到确切的问题。我想按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这不是我想要的。
任何帮助表示感谢,谢谢。
答案 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)