我有一个数据框,如下所示:
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解决方案?
答案 0 :(得分:0)
我不确定数据的一般特征,但是括起来的简单方法是做类似的事情
df %>% group_by(ID, Status) %>% summarise(begin=min(Date), end=min(Date))
这将给出每个状态的第一个和最后一个条目。另外,您可以过滤Status == 'A'
并按最小值/最大值进行汇总。
编辑:针对以下评论,我认为您想做一个整整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>