Подмножество всех строк на основе первого значения столбца - PullRequest
2 голосов
/ 09 января 2020

У меня проблема с подмножеством, на которой я застрял. Это фрагмент данных:

UniqueID MonthYear FirstObs
ABC123   OCT-18    1
ABC123   NOV-18    0
ABC123   JAN-19    0
ABC123   FEB-19    0
DEF446   MAY-19    1
DEF456   JUN-19    0
DEF456   JUL-19    0
GHI789   OCT-18    1
GHI789   NOV-18    0

Набор данных довольно большой и имеет ряд строк, которые выглядят как приведенный выше пример. Я хочу иметь возможность написать формулу поднабора, которая извлекает каждую строку с идентичными кусками уникальных идентификаторов, которые начинаются с FirstObs = 1, и складывают их в зависимости от месяца, в котором они возникли. У меня было бы что-то вроде следующего:

Subset1 (all uniqueIDs that originated in October)
UniqueID MonthYear FirstObs
ABC123   OCT-18    1
ABC123   NOV-18    0
ABC123   JAN-19    0
ABC123   FEB-19    0
GHI789   OCT-18    1
GHI789   NOV-18    0


Subset2 (all uniqueIDs that originated in May)
UniqueID MonthYear FirstObs    
DEF446   MAY-19    1
DEF456   JUN-19    0
DEF456   JUL-19    0

В идеале, у меня было бы одно подмножество для каждого чанка, который начинается с FirstObs = 1 из каждого месяца. Я знаю, что мне нужно использовать некоторые серии функций ifelse и subset, но я не уверен, как лучше использовать их go.

1 Ответ

2 голосов
/ 09 января 2020

Может быть, это поможет

library(dplyr)
df2 <- df1 %>% 
     group_by(UniqueID) %>% 
     filter(first(FirstObs) == 1 & n() > 1)
df3 <- anti_join(df1, df2)

Это также может быть

library(stringr)
df2 <- df1 %>%
          group_by(UniqueID) %>% 
          filter(first(FirstObs) == 1, 
                str_remove(first(MonthYear), "-\\d+") == "OCT")
df3 <- anti_join(df1, df2)

Или split в list фреймах данных

df1 %>%
   group_by(UniqueID) %>%
   mutate(grp = first(FirstObs) == 1 & n() > 1) %>%
   ungroup %>%
   group_split(grp, keep = FALSE)
#[[1]]
# A tibble: 3 x 3
#  UniqueID MonthYear FirstObs
#  <chr>    <chr>        <int>
#1 DEF446   MAY-19           1
#2 DEF456   JUN-19           0
#3 DEF456   JUL-19           0

#[[2]]
# A tibble: 6 x 3
#  UniqueID MonthYear FirstObs
#  <chr>    <chr>        <int>
#1 ABC123   OCT-18           1
#2 ABC123   NOV-18           0
#3 ABC123   JAN-19           0
#4 ABC123   FEB-19           0
#5 GHI789   OCT-18           1
#6 GHI789   NOV-18           0

данные

df1 <- structure(list(UniqueID = c("ABC123", "ABC123", "ABC123", "ABC123", 
"DEF446", "DEF456", "DEF456", "GHI789", "GHI789"), MonthYear = c("OCT-18", 
"NOV-18", "JAN-19", "FEB-19", "MAY-19", "JUN-19", "JUL-19", "OCT-18", 
"NOV-18"), FirstObs = c(1L, 0L, 0L, 0L, 1L, 0L, 0L, 1L, 0L)), 
class = "data.frame", row.names = c(NA, 
-9L))
...