#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