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
我的目标是以长格式表示我的 df
。 gather()
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
我有一个与 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()
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