2

私は次のものを持っていますdata.frame

df <- data.frame(id=c(1,2,3), 
                 first.date=as.Date(c("2014-01-01", "2014-03-01", "2014-06-01")), 
                 second.date=as.Date(c("2015-01-01", "2015-03-01", "2015-06-1")),
                 third.date=as.Date(c("2016-01-01", "2017-03-01", "2018-06-1")),
                 fourth.date=as.Date(c("2017-01-01", "2018-03-01", "2019-06-1")))

> df

  id first.date second.date third.date fourth.date
1  1 2014-01-01  2015-01-01 2016-01-01  2017-01-01
2  2 2014-03-01  2015-03-01 2017-03-01  2018-03-01
3  3 2014-06-01  2015-06-01 2018-06-01  2019-06-01

各行は 3 つのタイムスパンを表します。つまり、それぞれfirst.dateと、 、 、 、second.datesecond.dateの間の時間です。third.datethird.datefourth.date

より良い言葉がないので、データフレームのネストを解除して、代わりにこれを取得したいと思います:

  id  StartDate    EndDate
1  1 2014-01-01 2015-01-01
2  1 2015-01-01 2016-01-01
3  1 2016-01-01 2017-01-01
4  2 2014-03-01 2015-03-01
5  2 2015-03-01 2017-03-01
6  2 2017-03-01 2018-03-01
7  3 2014-06-01 2015-06-01
8  3 2015-06-01 2018-06-01
9  3 2018-06-01 2019-06-01

unnestパッケージの関数をいじってみましたがtidyr、本当に探しているものではないと思うという結論に達しました。

助言がありますか?

4

2 に答える 2

4

次のように tidyr/dplyr を試すことができます。

library(tidyr)
library(dplyr)
df %>% gather(DateType, StartDate, -id) %>% select(-DateType) %>% arrange(id) %>% group_by(id) %>% mutate(EndDate = lead(StartDate))

以下を追加することで、各 ID グループの最後の行を削除できます。

%>% slice(-4)

上記のパイプラインへ。

于 2016-01-07T18:10:09.927 に答える