2016-10-13 106 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