Смещение даты в столбце по идентификатору
У меня есть набор данных следующим образом
Id Date1
121 2011-01-03
121 2011-01-03
121 2011-04-02
121 2011-08-14
121 2012-01-14
121 2012-05-12
975 2011-02-01
975 2011-02-01
975 2011-06-14
975 2012-01-06
975 2012-04-19
975 2012-09-25
То, что я хочу создать - это вывод, подобный приведенному ниже, где новый столбец Date2 смещен на одно значение на основе идентификатора,
Id Date1 Date2
121 2011-01-03 2011-01-03
121 2011-01-03 2011-04-02
121 2011-04-02 2011-08-14
121 2011-08-14 2012-01-14
121 2012-01-14 2012-05-12
121 2012-05-12 NA
975 2011-02-01 2011-02-01
975 2011-02-01 2011-06-14
975 2011-06-14 2012-01-06
975 2012-01-06 2012-04-19
975 2012-04-19 2012-09-25
975 2012-09-25 NA
Строка 2 столбца Date2 для идентификатора 121, т.е. 2011-01-03 становится столбцом Date1, значение строки1 для идентификатора 121.
Столбец даты2 строка3 для идентификатора 121, т. Е. 2011-04-02 становится столбцом Дата1, значение строки2 для идентификатора 121... и так далее... Это должно происходить по идентификатору.
Любая помощь приветствуется.
1 ответ
С помощью dplyr
мы можем сгруппировать по 'Id' и создать новый столбец 'Date2', используя mutate
а также lead
library(dplyr)
df1 %>%
group_by(Id) %>%
mutate(Date2= lead(Date1))
# Id Date1 Date2
#1 121 2011-01-03 2011-01-03
#2 121 2011-01-03 2011-04-02
#3 121 2011-04-02 2011-08-14
#4 121 2011-08-14 2012-01-14
#5 121 2012-01-14 2012-05-12
#6 121 2012-05-12 NA
#7 975 2011-02-01 2011-02-01
#8 975 2011-02-01 2011-06-14
#9 975 2011-06-14 2012-01-06
#10 975 2012-01-06 2012-04-19
#11 975 2012-04-19 2012-09-25
#12 975 2012-09-25 NA
Или аналогичный вариант, используя версию devel data.table
будет преобразовывать "data.frame" в "data.table" (setDT(df1)
), сгруппируйте по 'Id' и используйте shift
функция с опцией type='lead'
library(data.table)#v1.9.5+
setDT(df1)[, Date2:= shift(Date1, type='lead') , by = Id][]
# Id Date1 Date2
# 1: 121 2011-01-03 2011-01-03
# 2: 121 2011-01-03 2011-04-02
# 3: 121 2011-04-02 2011-08-14
# 4: 121 2011-08-14 2012-01-14
# 5: 121 2012-01-14 2012-05-12
# 6: 121 2012-05-12 NA
# 7: 975 2011-02-01 2011-02-01
# 8: 975 2011-02-01 2011-06-14
# 9: 975 2011-06-14 2012-01-06
#10: 975 2012-01-06 2012-04-19
#11: 975 2012-04-19 2012-09-25
#12: 975 2012-09-25 NA
Или мы можем использовать ave
от base R
, Мы группируем по столбцу "Id", удаляем первое наблюдение и объединяем с NA
в конце.
df1$Date2 <- with(df1, ave(Date1, Id, FUN=function(x) c(x[-1], NA)))