我有一个与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
我对如何做到这一点的任何想法都非常受欢迎,非常感谢。
答案 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