我有一个带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
答案 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