R 在重塑数据框时添加行

R Add rows while reshaping a data frame

我有一个与 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

我的目标是以长格式表示我的 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

任何关于我如何做到这一点的想法都非常受欢迎并且非常感谢。

这是一种实现您想要的解决方案的方法:

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

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