R:重新排列数据框中行的顺序
R: Rearrange the order of the row in a dataframe
我想重新排列我的数据的顺序。我有一个如下所示的数据集:
Animal<-c("bird","Bird ","Dog","Cat F","Lion","Lion","Lion","dog","Horse","cat", "Lion")
A_date<-c("02-08-2020","20-06-2018","01-01-2015","10-07-2021","20-06-2018","15-08-2019","05-08-2013","20-06-2010","15-11-2016","22-03-2022","15-05-2019")
ID<-c("T1", "T1","T1","T2","T2","T3","T3","T4","T4","T15","T15")
Mydata<-data.frame(Animal, A_date,ID)
Animal A_date ID
bird 02-08-2020 T1
Bird 20-06-2018 T1
Dog 01-01-2015 T1
Cat F 10-07-2021 T2
Lion 20-06-2018 T2
Lion 15-08-2019 T3
lion 05-08-2013 T3
dog 20-06-2010 T4
Horse 15-11-2016 T4
cat 22-03-2022 T15
Lion 15-05-2019 T15
我使用下面的代码删除了重复的行,以便只有具有最新日期 pr 的行。 ID 将保留。
library(lubridate)
library(dplyr)
Mydata %>%
mutate(Animal = trimws(toupper(Animal)), A_date = lubridate::dmy(A_date)) %>%
group_by(ID, Animal) %>%
arrange(ID, Animal, -desc(A_date)) %>%
slice(1)
输出如下所示:
A tibble: 9 x 3
# Groups: ID, Animal [9]
Animal A_date ID
<chr> <date> <chr>
1 BIRD 2018-06-20 T1
2 DOG 2015-01-01 T1
3 CAT 2022-03-22 T15
4 LION 2019-05-15 T15
5 CAT F 2021-07-10 T2
6 LION 2018-06-20 T2
7 LION 2013-08-05 T3
8 DOG 2010-06-20 T4
9 HORSE 2016-11-15 T4
我想更改顺序,以便顺序为 pr。 ID 从最高 ID 开始,最新日期。
我希望结果如下所示:
Animal A_date ID
<chr> <date> <chr>
CAT 2022-03-22 T15
LION 2019-05-15 T15
HORSE 2016-11-15 T4
DOG 2010-06-20 T4
LION 2019-08-15 T3
CAT F 2021-07-10 T2
LION 2018-06-20 T2
BIRD 2020-08-02 T1
DOG 2015-01-01 T1
关于如何获得该结果有什么建议吗?
从 Mydata
开始是您的最后一个输出:
Mydata <- Mydata %>%
ungroup %>%
arrange(desc(as.numeric(gsub("T","",ID))),
desc(A_date))
输出
# A tibble: 9 x 3
Animal A_date ID
<chr> <date> <chr>
1 CAT 2022-03-22 T15
2 LION 2019-05-15 T15
3 HORSE 2016-11-15 T4
4 DOG 2010-06-20 T4
5 LION 2013-08-05 T3
6 CAT F 2021-07-10 T2
7 LION 2018-06-20 T2
8 BIRD 2018-06-20 T1
9 DOG 2015-01-01 T1
我先去掉了分组,这样我就可以排列所有的行,然后把ID中的T去掉,变成数字降序排列,然后像你之前自己做的那样重新排列在日期上.
ID 为 T3 的 LION 和 T1 的 BIRD 的日期在您的预期输出中可能不正确。如果不是这样,请告诉我,因为这意味着我不明白你的问题。
使用 data.table
,从您原来的 Mydata
开始:
library(data.table)
setDT(Mydata)[, c('Animal', 'A_date'):=.(trimws(toupper(Animal)), as.Date(A_date, '%d-%m-%Y'))]
setorder(Mydata, A_date)
Mydata[, .SD[.N], by=.(ID, Animal)][order(-as.integer(gsub('T', '', ID)), -A_date)]
## ID Animal A_date
## 1: T15 CAT 2022-03-22
## 2: T15 LION 2019-05-15
## 3: T4 HORSE 2016-11-15
## 4: T4 DOG 2010-06-20
## 5: T3 LION 2019-08-15
## 6: T2 CAT F 2021-07-10
## 7: T2 LION 2018-06-20
## 8: T1 BIRD 2020-08-02
## 9: T1 DOG 2015-01-01
第一行将Mydata
转换为data.table
并转换Animal
和A_date
。第二个订单 A_date
。第三行按 ID
和 Animal
分组并提取每个组的最后一行 ( .SD[.N]
)(最新日期),然后按 ID 号和日期降序重新排序。
我想重新排列我的数据的顺序。我有一个如下所示的数据集:
Animal<-c("bird","Bird ","Dog","Cat F","Lion","Lion","Lion","dog","Horse","cat", "Lion")
A_date<-c("02-08-2020","20-06-2018","01-01-2015","10-07-2021","20-06-2018","15-08-2019","05-08-2013","20-06-2010","15-11-2016","22-03-2022","15-05-2019")
ID<-c("T1", "T1","T1","T2","T2","T3","T3","T4","T4","T15","T15")
Mydata<-data.frame(Animal, A_date,ID)
Animal A_date ID
bird 02-08-2020 T1
Bird 20-06-2018 T1
Dog 01-01-2015 T1
Cat F 10-07-2021 T2
Lion 20-06-2018 T2
Lion 15-08-2019 T3
lion 05-08-2013 T3
dog 20-06-2010 T4
Horse 15-11-2016 T4
cat 22-03-2022 T15
Lion 15-05-2019 T15
我使用下面的代码删除了重复的行,以便只有具有最新日期 pr 的行。 ID 将保留。
library(lubridate)
library(dplyr)
Mydata %>%
mutate(Animal = trimws(toupper(Animal)), A_date = lubridate::dmy(A_date)) %>%
group_by(ID, Animal) %>%
arrange(ID, Animal, -desc(A_date)) %>%
slice(1)
输出如下所示:
A tibble: 9 x 3
# Groups: ID, Animal [9]
Animal A_date ID
<chr> <date> <chr>
1 BIRD 2018-06-20 T1
2 DOG 2015-01-01 T1
3 CAT 2022-03-22 T15
4 LION 2019-05-15 T15
5 CAT F 2021-07-10 T2
6 LION 2018-06-20 T2
7 LION 2013-08-05 T3
8 DOG 2010-06-20 T4
9 HORSE 2016-11-15 T4
我想更改顺序,以便顺序为 pr。 ID 从最高 ID 开始,最新日期。 我希望结果如下所示:
Animal A_date ID
<chr> <date> <chr>
CAT 2022-03-22 T15
LION 2019-05-15 T15
HORSE 2016-11-15 T4
DOG 2010-06-20 T4
LION 2019-08-15 T3
CAT F 2021-07-10 T2
LION 2018-06-20 T2
BIRD 2020-08-02 T1
DOG 2015-01-01 T1
关于如何获得该结果有什么建议吗?
从 Mydata
开始是您的最后一个输出:
Mydata <- Mydata %>%
ungroup %>%
arrange(desc(as.numeric(gsub("T","",ID))),
desc(A_date))
输出
# A tibble: 9 x 3
Animal A_date ID
<chr> <date> <chr>
1 CAT 2022-03-22 T15
2 LION 2019-05-15 T15
3 HORSE 2016-11-15 T4
4 DOG 2010-06-20 T4
5 LION 2013-08-05 T3
6 CAT F 2021-07-10 T2
7 LION 2018-06-20 T2
8 BIRD 2018-06-20 T1
9 DOG 2015-01-01 T1
我先去掉了分组,这样我就可以排列所有的行,然后把ID中的T去掉,变成数字降序排列,然后像你之前自己做的那样重新排列在日期上.
ID 为 T3 的 LION 和 T1 的 BIRD 的日期在您的预期输出中可能不正确。如果不是这样,请告诉我,因为这意味着我不明白你的问题。
使用 data.table
,从您原来的 Mydata
开始:
library(data.table)
setDT(Mydata)[, c('Animal', 'A_date'):=.(trimws(toupper(Animal)), as.Date(A_date, '%d-%m-%Y'))]
setorder(Mydata, A_date)
Mydata[, .SD[.N], by=.(ID, Animal)][order(-as.integer(gsub('T', '', ID)), -A_date)]
## ID Animal A_date
## 1: T15 CAT 2022-03-22
## 2: T15 LION 2019-05-15
## 3: T4 HORSE 2016-11-15
## 4: T4 DOG 2010-06-20
## 5: T3 LION 2019-08-15
## 6: T2 CAT F 2021-07-10
## 7: T2 LION 2018-06-20
## 8: T1 BIRD 2020-08-02
## 9: T1 DOG 2015-01-01
第一行将Mydata
转换为data.table
并转换Animal
和A_date
。第二个订单 A_date
。第三行按 ID
和 Animal
分组并提取每个组的最后一行 ( .SD[.N]
)(最新日期),然后按 ID 号和日期降序重新排序。