将时间戳拆分为两列

时间:2016-05-20 07:27:10

标签: r date

我有一个带ID的列,每个ID都有几个偶数日期。我想创建两个列,每行包含第一个日期,另一个列具有第一个日期,另一个列具有下一个连续日期。 ID的下一行应该具有上一行第二列中的条目以及该ID的下一个连续日期。一个例子:

这是我的数据

     id       date 
1       1 2015-01-01       
2       1 2015-01-18       
3       1 2015-08-02    
4       2 2015-01-01   
5       2 2015-01-13     
6       3 2015-01-01   

这是我想要的数据

   id       date1       date2
1       1 2015-01-01    2015-01-18   
2       1 2015-01-18    2015-08-02   
3       1 2015-08-02    NA
4       2 2015-01-01    2015-01-13
5       2 2015-01-13    NA 
6       3 2015-01-01    NA

4 个答案:

答案 0 :(得分:3)

使用dplyr

library(dplyr)

df %>% group_by(id) %>%
  mutate(date2 = lead(date))

     id       date      date2
  (int)     (fctr)     (fctr)
1     1 2015-01-01 2015-01-18
2     1 2015-01-18 2015-08-02
3     1 2015-08-02         NA
4     2 2015-01-01 2015-01-13
5     2 2015-01-13         NA
6     3 2015-01-01         NA

答案 1 :(得分:2)

使用data.table,您可以执行以下操作:

require(data.table)
DT[, .(date1 = date, date2 = shift(date, type = "lead")), by = id]

或简单地(也被@docendodiscimus提及)

DT[, date2 := shift(date, type = "lead"), by = id]

此外,如果您有兴趣制作递归n列(已编辑,利用@docendodiscimus评论来简化代码)

i = 1:5
DT[, paste0("date", i+1) := shift(date, i, type = "lead"), by = id]

答案 2 :(得分:1)

使用transform()ave()的基础R解决方案:

transform(df,date1=date,date2=ave(date,id,FUN=function(x) c(x[-1L],NA)),date=NULL);
##   id      date1      date2
## 1  1 2015-01-01 2015-01-18
## 2  1 2015-01-18 2015-08-02
## 3  1 2015-08-02       <NA>
## 4  2 2015-01-01 2015-01-13
## 5  2 2015-01-13       <NA>
## 6  3 2015-01-01       <NA>

上面的代码行生成了data.frame的副本。返回值可以在原始df上分配,分配给新变量,或作为参数/操作数传递给函数/运算符。如果您想要就地修改它,这将是一种更有效的覆盖df的方法,您可以这样做:

df$date2 <- ave(df$date,df$id,FUN=function(x) c(x[-1L],NA));
colnames(df)[colnames(df)=='date'] <- 'date1';
df;
##   id      date1      date2
## 1  1 2015-01-01 2015-01-18
## 2  1 2015-01-18 2015-08-02
## 3  1 2015-08-02       <NA>
## 4  2 2015-01-01 2015-01-13
## 5  2 2015-01-13       <NA>
## 6  3 2015-01-01       <NA>

答案 3 :(得分:0)

red view