2016-10-13 36 views
0

我有一個與df類似的數據框,它看起來像條目註冊表並在系統中退出。R在重新調整數據幀的同時添加行

df = data.frame(id = c("A", "B"), entry = c(2011, 2014), exit = c(2013, 2015)) 

> df 
    id entry exit 
1 A 2011 2013 
2 B 2014 2015 

我的目標是用長格式表示我的dfgather() from tidyr可以做這樣的事情。

df_long = df %>% gather(registry, time, entry:exit) %>% arrange(id) 

> df_long 
    id registry time 
1 A entry 2011 
2 A  exit 2013 
3 B entry 2014 
4 B  exit 2015 

然而,我堅持我如何可以納入,將代表我的觀察(id)在系統中有效時間等附加行。我期望data.frame那麼會是這個樣子:

id time 
1 A 2011 
2 A 2012 
3 A 2013 
4 B 2013 
5 B 2014 
6 B 2015 

的我怎麼能做到這一點任何想法多於歡迎,非常感謝。

回答

1

這裏有一個方法來對你的期望的解決方案中獲得:

df1 <- data.frame(id = c("A", "B"), entry = c(2011, 2014), exit = c(2013, 2015)) 
setNames(stack(by(df1, df1$id, function(x) x$entry : x$exit))[,c(2,1)], 
    c('id','time')) 

    id time 
1 A 2011 
2 A 2012 
3 A 2013 
4 B 2014 
5 B 2015 
+0

謝謝@bouncyball。你認爲這種方法會讓更多的變量,例如'df1 < - data.frame(id = c(「A」,「B」),region = c(「country.1」,「country.2」 ),entry = c(2011,2014),exit = c(2013,2015))? – Edu

0

UPDATE:基於plyr結合上面的註釋另一種解決辦法是:

df1 <- data.frame(id = c("A", "B"), region = c("country.1", "country.2"), entry = c(2011, 2014), exit = c(2013, 2015)) 

library(plyr) 
ddply(df1, .(id,region), summarize, time=seq(entry, exit)) 

國債收益率:

id region  time 
1 A country.1  2011 
2 A country.1  2012 
3 A country.1  2013 
4 B country.2  2014 
5 B country.2  2015 
+0

我打算參考[這個答案](http://stackoverflow.com/questions/11494511/expanding-a-sequence-in-a-data-frame),但它似乎像你找到了一種方式它在擴大的問題上。 – bouncyball

+0

謝謝@ bouncyball。我一直試圖在'dplyr'中複製(可能對更大的樣本更快) – Edu