【问题标题】:Expanding rows by date whilst keeping all other variables按日期扩展行,同时保留所有其他变量
【发布时间】:2017-08-12 19:19:35
【问题描述】:

我有一个类似于已经问过的问题: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_dateend_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

如果有人可以在这里帮助我,我将非常感激!干杯

【问题讨论】:

  • 也许 tidyr 包中的 expandcomplete 有帮助?

标签: r date panel-data


【解决方案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))

【讨论】:

    猜你喜欢
    • 2022-11-23
    • 2016-11-27
    • 1970-01-01
    • 2019-11-21
    • 1970-01-01
    • 2021-01-29
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多