Группировка данных по последней записи

#r #group-by

#r #группировать по

Вопрос:

У меня есть следующие данные

 pt_id <- c(1,1,1,1,1,2,2,2,3,3,3,3,3,4,4,4,4)
visit_id <- c(11,12,13,14,15,21,22,23,31,32,33,34,35,41,42,43,44)
visit <- c(2019, 2019, 2019, 2019, 2020, 2019, 2019, 2020, 2019, 2019, 2019, 2019, 2020, 2019, 2020, 2020, 2020)
mydata <- data.frame(pt_id, visit_id, visit)
mydata
 

Мне был предоставлен только год для переменной ‘visit’, однако он был упорядочен от самого старого к самому новому для каждого ‘pt_id’. Я хочу создать новый столбец, в котором строки ранжируются в порядке убывания, сгруппированные по ‘pt_id’.

Желаемый результат:

   pt_id   visit_id visit Row_rank
1      1       11  2019   5
2      1       12  2019   4
3      1       13  2019   3
4      1       14  2019   2
5      1       15  2020   1
6      2       21  2019   3
7      2       22  2019   2
8      2       23  2020   1
9      3       31  2019   5
10     3       32  2019   4
11     3       33  2019   3
12     3       34  2019   2
13     3       35  2020   1
14     4       41  2019   4
15     4       42  2020   3
16     4       43  2020   2
17     4       44  2020   1
 

Спасибо!

Комментарии:

1. @Eric Krantz Я отредактировал, чтобы добавить желаемый результат.

Ответ №1:

Я буду использовать visit_id для новой переменной, вместо order , поскольку order это функция в базе R.

 mydata_lstvst <- mydata %>%
    arrange(pt_id, visit, .by_group = TRUE) %>% 
    group_by(pt_id) %>% 
    mutate(order = n() - row_number()   1) %>% 
    ungroup() %>% 
    arrange(pt_id, visit, desc(order)) %>% 
    filter(order == 1)

mydata_lstvst
 

РЕДАКТИРОВАТЬ: обновлено для адресного комментария (фильтр по visit_id == 1).

Комментарии:

1. Спасибо! Сейчас я пытаюсь закодировать группировку данных по ‘pt_id’ для ‘visit_n’ со значением 1. Я не могу записать желаемый результат в комментарии. Дайте мне знать, если вы можете закодировать для этого.

2. Добавьте %>% filter(order == 1) в конец этого кода.

3. Получение этой ошибки Error in order == 1 : comparison (1) is possible only for atomic and list types

4. Итак, я сделал подмножество для visit_n со значением 1 🙂 mydata_lstvst_1 <- subset(mydata_lstvst, visit_n == 1) Большое спасибо!

5. Ах, проблема заключалась в том, что я использовал order для имени переменной, а вы использовали подоконник visit_id . order является функцией в базе R. Это будет работать, но должно быть согласовано во всем ( order должно быть переменной в df, иначе R пытается выполнить фильтрацию по имени функции).