如何在 R 中使用 ave() 和 seq_along() 函数为一组创建包含先前日期的列

问题描述 投票:0回答:1
我是 R 初学者,尝试结合

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
    
r
1个回答
0
投票
最好的方法是使用

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]))
    
© www.soinside.com 2019 - 2024. All rights reserved.