我有一个包含日期范围的数据框,我想从中创建代表该范围所包含的每年的新行(包括开始和结束年份)。它看起来像这样:
id start end
1 2000 2004
2 2005 2005
3 2005 2007
4 2001 2002
'id'是一个因素,'start'和'end'是日期。
但是我需要将数据框扩展为如下所示:
id year
1 2000
1 2001
1 2002
1 2003
1 2004
2 2005
3 2005
3 2006
3 2007
4 2001
4 2002
我尝试过这里建议的方法:Expand rows by date range using start and end date和Generate rows between two dates in a dataframe。特别是我跑了:
library(data.table)
setDT(df)[, .(year = seq.Date(start, end, by = '1 year')), by = 'id']
并尝试了dplyr方法:
library(dplyr)
library(purrr)
df_expanded <- df %>%
transmute(id, year = map2(start, end, seq, by = "year")) %>%
unnest %>%
distinct
两次尝试都导致类似的错误:
Error in seq.int(r1$year, to0$year, by) : wrong sign in 'by' argument
我看了,但我无法弄清楚为什么我收到这个错误。我应该提到,YYYY-MM-DD格式的全日期也会出现此错误。我对每月或每日差异不感兴趣所以我将这些差异重新格式化为YYYY,但此代码仍然返回错误消息。
有人可以帮忙吗?
样本数据
library(data.table)
DT <- fread("id start end
1 2000 2004
2 2005 2005
3 2005 2007
4 2001 2002")
码
year
是数字(而不是日期),所以你可以通过start
创建一个从end
到id
的向量。
DT[, .(year = start:end), by = .(id)][]
产量
# id year
# 1: 1 2000
# 2: 1 2001
# 3: 1 2002
# 4: 1 2003
# 5: 1 2004
# 6: 2 2005
# 7: 3 2005
# 8: 3 2006
# 9: 3 2007
# 10: 4 2001
# 11: 4 2002