ave()
和
seq_along()
函数。我想向 DF 添加一列,其中包含列名称中包含相同值的行中出现的上一个日期。
我有一个包含列名称和日期的 DF。我想添加一个列,其中包含该名称的先前日期记录器。这就是我希望得到的:
name date prev_date_name
1 aaa 2000-01-01 <NA>
2 aaa 2000-01-02 2000-01-01
3 bbb 2000-01-03 <NA>
4 bbb 2000-01-04 2000-01-03
5 bbb 2000-01-05 2000-01-04
6 bbb 2000-01-05 2000-01-05
7 eee 2000-01-06 <NA>
8 eee 2000-01-07 2000-01-06
9 eee 2000-01-08 2000-01-07
我正在使用此代码:
#create DF
name <- c('aaa', 'aaa', 'bbb', 'bbb', 'bbb', 'bbb', 'eee', 'eee', 'eee')
date <- c('2000-01-02', '2000-01-01', '2000-01-03', '2000-01-04', '2000-01-05', '2000-01-05', '2000-01-06', '2000-01-07', '2000-01-08')
list_names <- data.frame(name, date)
#sort bij date
list_names <- arrange(list_names, date)
#add column with previous date from group with the same name
list_names$prev_date_name <- ave(list$date, list$name, FUN = function(x) ifelse(seq_along(x)==1, NA, x[as.integer(seq_along(x))-1]))
print(list_names)
但是得到这个结果:
name date prev_date_name
1 aaa 2000-01-01 <NA>
2 aaa 2000-01-02 2000-01-01
3 bbb 2000-01-03 <NA>
4 bbb 2000-01-04 2000-01-04
5 bbb 2000-01-05 2000-01-05
6 bbb 2000-01-05 2000-01-03
7 eee 2000-01-06 <NA>
8 eee 2000-01-07 2000-01-06
9 eee 2000-01-08 2000-01-06
dplyr
:
library(dplyr)
list_names %>%
mutate(prev_date = lag(date),
.by = name)
但是如果您必须使用 ave()
和
seq_along
,您可以这样做:
list_names$prev_date <- ave(as.Date(list_names$date), list_names$name,
FUN = \(x) c(NA, x[seq_along(x) - 1]))