我有一个非常大的数据集,我需要按年份、月份、日期列的升序排列,然后按ID列的特定顺序排列。如果我希望所有数据都按升序排列,我会这样做,但我不知道如何按特定顺序排列我的ID列。
# Create fake data:
df <- data.frame(Year = rep(2018,20),
Month = rep(1, 20),
Day = rep(seq(1:4), 5),
ID = rep(c("cat", "dog", "fish", "pie", "mango"), 4))
# Order data
df <- df %>%
data.table::setDT() %>%
data.table::setorder(c("Year", "Month", "Day"))
假设这是我需要的订单ID栏:
Desired_ID_order <- c("fish", "dog", "pie", "mango", "cat")
所以最终排序的答案是这样的:
Year Month Day ID
1 2018 1 1 fish
2 2018 1 1 dog
3 2018 1 1 pie
4 2018 1 1 mango
5 2018 1 1 cat
6 2018 1 2 fish
7 2018 1 2 dog
8 2018 1 2 pie
9 2018 1 2 mango
10 2018 1 2 cat
11 2018 1 3 fish
12 2018 1 3 dog
13 2018 1 3 pie
14 2018 1 3 mango
15 2018 1 3 cat
16 2018 1 4 fish
17 2018 1 4 dog
18 2018 1 4 pie
19 2018 1 4 mango
20 2018 1 4 cat
谢谢!
也许这有助于
library(dplyr)
library(data.table)
df %>%
arrange(Year, Month, rowid(match(ID, Desired_ID_order)),
match(ID, Desired_ID_order))
-输出
# Year Month Day ID
#1: 2018 1 1 fish
#2: 2018 1 1 dog
#3: 2018 1 1 pie
#4: 2018 1 1 mango
#5: 2018 1 1 cat
#6: 2018 1 2 fish
#7: 2018 1 2 dog
#8: 2018 1 2 pie
#9: 2018 1 2 mango
#10: 2018 1 2 cat
#11: 2018 1 3 fish
#12: 2018 1 3 dog
#13: 2018 1 3 pie
#14: 2018 1 3 mango
#15: 2018 1 3 cat
#16: 2018 1 4 fish
#17: 2018 1 4 dog
#18: 2018 1 4 pie
#19: 2018 1 4 mango
#20: 2018 1 4 cat
library(dplyr)
df %>%
mutate(new_ID = case_when(ID == "fish" ~ 1,
ID == "dog" ~ 2,
ID == "pie" ~3,
ID == "mango" ~ 4,
ID == "cat" ~ 5)) %>%
arrange(Year, Month, Day, new_ID) %>%
select(-new_ID)
输出:
Year Month Day ID
1 2018 1 1 fish
2 2018 1 1 dog
3 2018 1 1 pie
4 2018 1 1 mango
5 2018 1 1 cat
6 2018 1 2 fish
7 2018 1 2 dog
8 2018 1 2 pie
9 2018 1 2 mango
10 2018 1 2 cat
11 2018 1 3 fish
12 2018 1 3 dog
13 2018 1 3 pie
14 2018 1 3 mango
15 2018 1 3 cat
16 2018 1 4 fish
17 2018 1 4 dog
18 2018 1 4 pie
19 2018 1 4 mango
20 2018 1 4 cat