Пометить строку перед повторным началом подсчета

#r #dplyr

#r #dplyr

Вопрос:

 shift = c(1,1,1,1,1,1,1,1,2,2,2,2,2,2,2,2,2,2,3,3,3,3,3,3,3)
count =c(1,2,3,4,5,6,7,8,1,2,3,4,5,6,7,8,9,10,1,2,3,4,5,6,7)
test <- cbind(shift,count)
  

Итак, я пытаюсь пометить каждую последнюю строку для каждой смены (так count = c(8,10,7) что строки с двоичным номером 1 и каждая другая строка с 0. Прямо сейчас я думаю, может быть, это возможно с помощью левого соединения, но я не совсем уверен. Я бы предпочел не работать с циклами, а использовать некоторые методы из dplyr. Спасибо, ребята!

Ответ №1:

Предполагая, что вы хотите добавить новый столбец 0/1 last , который содержит 1 в последней строке каждой смены, и что смены являются непрерывными, вот два базовых подхода R:

 transform(test, last = ave(count, shift, FUN = function(x) x == max(x)))

transform(test, last =  !duplicated(shift, fromLast = TRUE))
  

или с помощью dplyr mutate :

 test %>%
  as.data.frame %>%
  group_by(shift) %>%
  mutate(last =  (1:n() == n())) %>%
  ungroup

test %>% 
  as.data.frame %>%
  mutate(last =  !duplicated(shift, fromLast = TRUE))
  

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

1. Спасибо, Г. Гротендик. Первый, похоже, хорошо работает с тестовыми данными, однако я на самом деле не работаю с моими фактическими данными. Могу я спросить, почему вы используете ave() команду в первом решении?

Ответ №2:

Попробуйте это

 library(dplyr)
test %>% 
   as_tibble() %>% 
   group_by(shift) %>% 
   mutate(is_last = ifelse( row_number() == max(row_number()), 1, 0)) %>% 
   ungroup()
# A tibble: 25 x 3
   shift count is_last
   <dbl> <dbl>   <dbl>
 1     1     1       0
 2     1     2       0
 3     1     3       0
 4     1     4       0
 5     1     5       0
 6     1     6       0
 7     1     7       0
 8     1     8       1
 9     2     1       0
10     2     2       0
# … with 15 more rows