2017-08-12 89 views
0

我也有類似的一個問題已經被問: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 

相反的數據範圍的,我想具有用於每個m月度數據start_date and 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

在tidyr包中可能'expand'或'complete'可能有幫助嗎? – gjabel

回答

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))