如何根据R中最后一行中的条件过滤第一行和最后一行

时间:2019-09-23 20:13:26

标签: dplyr

我有一个数据框,如下所示:

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')

我要过滤数据帧,以保留ID的第一行和最后一行(按日期排列),ID为Status ='A'和Next_Status ='I'(在以后的日期)

我尝试以此过滤数据帧:

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

与此有关的问题是,当该ID为“ A”时,我失去了第一天的信息。我最终希望找到特定ID保持“ A”状态的天数。因此,我在考虑是否可以根据最后一行中的条件(状态=='A'和Next_Status =='I')按第一行和最后一行过滤数据帧,然后可以计算出天数在状态更改为“ I”之前处于“ A”状态。我想知道是否有任何dplyr解决方案?

1 个答案:

答案 0 :(得分:0)

我不确定数据的一般特征,但是括起来的简单方法是做类似的事情

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

这将给出每个状态的第一个和最后一个条目。另外,您可以过滤Status == 'A'并按最小值/最大值进行汇总。

编辑:针对以下评论,我认为您想做一个整整spread来将数据转换为可消化的形式。我们将StatusNext_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>