R在重塑数据框时添加行

时间:2016-10-13 17:41:50

标签: reshape tidyr

我有一个与df类似的数据框,看起来像是系统中条目和出口的注册表。

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

我的目标是以长格式表示我的df。来自gather()的{​​{1}}可以执行此类操作。

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

我对如何做到这一点的任何想法都非常受欢迎,非常感谢。

2 个答案:

答案 0 :(得分: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

答案 1 :(得分:0)

更新:基于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