Как отфильтровать первую и последнюю строку на основе условия в последней строке в R - PullRequest
0 голосов
/ 23 сентября 2019

У меня есть следующий фрейм данных:

x <- seq(1,100, by = 1)
y <- 'A'
z <- 'A'
df1 <- data.frame(ID = x, Status = y, Next_Status = z)
x1 <- seq(1,50, by = 1)
y1 <- 'A'
z1 <- 'I'
df2 <- data.frame(ID = x1, Status = y1, Next_Status = z1)
df <- rbind(df1, df2)
df$Date <- seq(as.Date('2019-01-01'), as.Date('2019-05-30'), by = 'day')

Я хочу отфильтровать фрейм данных таким образом, чтобы я сохранил первую строку и последнюю строку (упорядоченные по дате) идентификатора, который имеет статус= 'A' и Next_Status = 'I' (позднее)

Я попытался отфильтровать фрейм данных следующим образом:

df_filtered <- df %>% filter(Status == 'A' & Next_Status == 'I')

Проблема в том, что я теряю информациюпервый день для этого удостоверения личности, когда это было «А».В конечном итоге я хотел бы узнать, сколько дней конкретный идентификатор оставался в статусе «А».Поэтому я подумал, что если бы я мог отфильтровать кадр данных по первой и последней строке на основе условия в последней строке (Status == 'A' & Next_Status == 'I'), я мог бы тогда вычислить количество дней, в течение которых оно былов состоянии «А», прежде чем он изменился на «Я».Мне было интересно, есть ли решение dplyr для этого?

1 Ответ

0 голосов
/ 23 сентября 2019

Я не уверен в общем характере данных, но простой способ заключить в скобки это сделать что-то вроде

df %>% group_by(ID, Status) %>% summarise(begin=min(Date), end=min(Date))

Это даст первые и последние записи для каждого состояния.Кроме того, вы можете отфильтровать по Status == 'A' и суммировать по мин. / Макс.

РЕДАКТИРОВАТЬ: В ответ на комментарий ниже, я думаю, вы хотели бы сделать Tidyr spread, чтобы получить данные в удобоваримойформа.Мы объединяем Status и Next_Status в один столбец, затем получаем время, когда мы вошли в это состояние, а затем распределяем его по нескольким столбцам.

df %>% mutate(State=paste(Status, Next_Status, sep='-')) %>%
  group_by(ID, State) %>% summarise(Start=min(Date)) %>%
  filter(State == 'A-A' | State == 'A-I') %>%
  spread(State, Start) %>% as.data.frame

Что дает что-то вроде:

     ID        A-A        A-I
1     1 2019-01-01 2019-04-11
2     2 2019-01-02 2019-04-12
3     3 2019-01-03 2019-04-13
...
48   48 2019-02-17 2019-05-28
49   49 2019-02-18 2019-05-29
50   50 2019-02-19 2019-05-30
51   51 2019-02-20       <NA>
52   52 2019-02-21       <NA>
53   53 2019-02-22       <NA>
54   54 2019-02-23       <NA>
55   55 2019-02-24       <NA>
56   56 2019-02-25       <NA>
57   57 2019-02-26       <NA>
58   58 2019-02-27       <NA>
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...