我一直在研究如何有条件地延迟同一ID组中的日期变量,但如果下一个日期值与原始日期相同,则跳过它并延迟后面的日期值。
data have
ID Value Date
a 50 1987-01-01
a 52 1987-01-01
a 33 1989-05-03
b 10 1979-08-28
b 52 1988-02-23
b 45 1988-02-23
b 33 1988-02-23
b 40 1990-05-20
data want
ID Value Date Lead_date
a 50 1987-01-01 1989-05-03
a 52 1987-01-01 1989-05-03
a 33 1989-05-03 NA
b 10 1979-08-28 1988-02-23
b 52 1988-02-23 1990-05-20
b 45 1988-02-23 1990-05-20
b 33 1988-02-23 1990-05-20
b 40 1990-05-20 NA
我不确定是否有一种优雅的方法来实现这一点,或者我是否需要一个for循环?
任何建议都非常感谢!
3条答案
按热度按时间zd287kbt1#
1)
findInterval
将查找与当前日期匹配的最后一个日期的位置,因此只需加1即可获得下一个日期的位置。**2)**另一种方法是获取Date与唯一日期匹配的位置,然后获取下一个唯一日期:
**3)**另一种方法是将重复的日期替换为NA,然后使用na.locf0在获取下一个日期时填充它们。
注解
1mrurvl12#
数据
ha5z0ras3#
你可以使用
for
循环来实现这个功能,但是在R
中有一个更优雅的方法,使用dplyr
和data.table
包。它首先为每个
ID
和Value
组创建一个只包含最后一个日期的新数据框df_lead_dates
。然后使用left_join
函数将此数据框与原始数据框连接。最后,它将Lead_date
列中的NA
值替换为NA_real_
。这是R
中的特殊类型的缺失值,其指示缺少真实的值。