我有一个问题类似于已经被问过的问题:Given start date and end date, reshape/expand data for each day between (each day on a row)
这是我数据的一个子集(并非包含所有变量;总共有43个变量):
start_date <- as.Date(c("1946-01-01", "1966-01-01","1979-03-01", "1966-01-01", "1988-05-01"))
end_date <- as.Date(c("1946-03-01","1966-03-01","1979-05-01", "1966-03-01", "1988-07-01"))
dyad_id <- c(260,260,260,306,306)
armsproc <- c("moderate", "low", "low", "low", "low")
gov_support <- c("explicit", "no", "no", "no", "explicit")
terrcont <- c("yes", "no", "no", "yes", "yes")
x <- data.frame(start_date, end_date, dyad_id, armsproc, gov_support, terrcont)
这是我的样本数据的可视化:
start_date end_date dyad_id armsproc gov_support terrcont
1 1946-01-01 1946-03-01 260 moderate explicit yes
2 1966-01-01 1966-03-01 260 low no no
3 1979-03-01 1979-05-01 260 low no no
4 1966-01-01 1966-03-01 306 low no yes
5 1988-05-01 1988-07-01 306 low explicit yes
我希望在 start_date 和 end_date 之间每月有月度数据,而不是数据范围。此外,在上面链接的问题中没有回答,我希望所有剩余列中的数据只是在该时间段内的所有月份中重复。为了清楚起见,我希望在每个 dyad_id 中完成此数据复制。我想要一些看起来像这样的东西:
month dyad_id armsproc gov_support terrcont
1946-01-01 260 moderate explicit yes
1946-02-01 260 moderate explicit yes
1946-03-01 260 moderate explicit yes
1966-01-01 260 low no no
1966-02-01 260 low no no
1966-03-01 260 low no no
1979-03-01 260 low no no
1979-04-01 260 low no no
1979-05-01 260 low no no
1966-01-01 306 low no yes
1966-02-01 306 low no yes
1966-03-01 306 low no yes
1988-05-01 306 low explicit yes
1988-06-01 306 low explicit yes
1988-07-01 306 low explicit yes
我尝试使用类似于其他问题中建议的代码
x %>%
rowwise() %>%
do(data.frame(dyad_id=.$dyad_id, month=seq(.$start_date,.$end_date,by="1 month")))
但这只产生了以下数据框,只有2列:
# A tibble: 6 x 2
dyadid month
<int> <date>
1 462 1946-06-01
2 462 1946-07-01
3 463 1952-04-01
4 464 1967-03-01
5 464 1967-04-01
6 464 1967-05-01
如果有人能帮助我,我将非常感激!干杯
答案 0 :(得分:1)
我全心全意地道歉,但我找到了一个回答我问题的先前问题!在发布我的问题之前,我已经在stackoverflow上搜索了一个小时,但找不到我想要的内容。此相关问题的链接是:R -- Expand date range into panel data by group
对于任何可能感兴趣的人,我使用了以下代码(注意:此代码适用于我的复杂数据集,而不是我在问题中使用的示例数据集):
f <- function(x) with(x, data.frame(dyadid, extraterritorial, rebpolwing,
rebpolwinglegal, rebestimate, rebstrength,
centcontrol, strengthcent, mobcap, armsproc,
fightcap, terrcont, terrname, effterrcont,
conflicttype, transconstsupp, rebextpart,
rebpresosts, presname, rebel.support,
rtypesup, rsupname, gov.support, gtypesup,
gsupname, govextpart,
date = seq(start_year_month, end_year_month, by = "month")))
NSA2 <- do.call("rbind", by(NSA1, 1:nrow(NSA1), f))