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并转换AnimalA_date。第二个订单 A_date。第三行按 IDAnimal 分组并提取每个组的最后一行 ( .SD[.N] )(最新日期),然后按 ID 号和日期降序重新排序。