Как выбрать непрерывные строки в кадре данных R на основе условий? - PullRequest
0 голосов
/ 25 октября 2018

У меня есть датафрейм df, в котором есть столбец даты, группы и дней разрыва.Я хочу выбрать для группы все строки, в которых дни разрыва непрерывно равны 1 от последней даты (максимальная дата).Если разрывные дни не равны 1, то мы игнорируем строки до точки, где разрывные дни не равны 1.Для воспроизводимых целей я создал текущий df и ожидаемый df ...

df<-data.frame(Date=c("2018-10-15","2018-10-16","2018-10-17",
                  "2018-10-14","2018-10-15","2018-10-16","2018-10-18","2018-10-19",
                  "2018-10-18","2018-10-21","2018-10-23","2018-10-24","2018-10-27","2018-10-28"),Group=c("a","a","a","b","b","b","b","b","c","c","c","c","c","c"),Gap_Days=c(1,1,1,1,1,2,1,1,3,2,1,3,1,1))


df_expected<-data.frame(Date=c("2018-10-15","2018-10-16","2018-10-17","2018-10-18","2018-10-19","2018-10-27","2018-10-28"),Group=c("a","a","a", "b","b","c","c"),Gap_Days=c(1,1,1,1,1,1,1))

Ответы [ 2 ]

0 голосов
/ 25 октября 2018

Единственная разница между моим первым комментарием и тем, что работает сейчас, заключается в введении группировки в вопрос.

База R:

do.call("rbind", by(df, df$Group, FUN=function(d) d[rev(cumall(rev(d$Gap_Days == 1))),]))
#            Date Group Gap_Days
# a.1  2018-10-15     a        1
# a.2  2018-10-16     a        1
# a.3  2018-10-17     a        1
# b.7  2018-10-18     b        1
# b.8  2018-10-19     b        1
# c.13 2018-10-27     c        1
# c.14 2018-10-28     c        1

Tidyverse:

df %>%
  group_by(Group) %>%
  filter(rev(cumall(rev(Gap_Days == 1)))) %>%
  ungroup()
# # A tibble: 7 x 3
#   Date       Group Gap_Days
#   <fct>      <fct>    <dbl>
# 1 2018-10-15 a            1
# 2 2018-10-16 a            1
# 3 2018-10-17 a            1
# 4 2018-10-18 b            1
# 5 2018-10-19 b            1
# 6 2018-10-27 c            1
# 7 2018-10-28 c            1
0 голосов
/ 25 октября 2018

Вот один метод с tidyverse

library(dplyr)
library(data.table)
df %>% 
   group_by(grp = rleid(Gap_Days), 
   ind = any(Date == max(.data$Date))) %>% 
   ungroup %>% 
   filter(grp == max(grp) & ind) %>% 
   select(-ind, -grp)
# A tibble: 3 x 2
#   Date       Gap_Days
#  <date>        <dbl>
#1 2018-10-19        1
#2 2018-10-20        1
#3 2018-10-21        1

Если столбец «Дата» уже упорядочен, то нам просто нужно проверить 1 в «Gap_Days

i1 <- inverse.rle(within.list(rle(df$Gap_Days == 1), 
           values[lengths < max(lengths) & values] <- FALSE))
df[i1,, drop = FALSE]
»
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...