如何在R面板数据框中按国家每5行重复首行值生成新变量
问题描述
我有一个包含960条观测值的面板数据框,想要创建名为new.var的新变量:按country分组后,将每组内每5行组成的块的首行Old.var值,填充到该块的所有行中。
示例数据
df <- data.frame( year=rep(c(2001:2010),2), country=c(rep("A",10),rep("B",10)), Old.var= c(12,26,14,9,7,42,13,12,24,13, 19,32,44,63,24,12,16,9,10, 5) )
输出结果:
year country Old.var 1 2001 A 12 2 2002 A 26 3 2003 A 14 4 2004 A 9 5 2005 A 7 6 2006 A 42 7 2007 A 13 8 2008 A 12 9 2009 A 24 10 2010 A 13 11 2001 B 19 12 2002 B 32 13 2003 B 44 14 2004 B 63 15 2005 B 24 16 2006 B 12 17 2007 B 16 18 2008 B 9 19 2009 B 10 20 2010 B 5
期望输出
df.new <- data.frame( year=rep(c(2001:2010),2), country=c(rep("A",10),rep("B",10)), Old.var= c(12,26,14,9,7,42,13,12,24,13, 19,32,44,63,24,12,16,9,10, 5), new.var= c(12,12,12,12,12,42,42,42,42,42,19,19,19,19,19,12,12,12,12,12) )
输出结果:
year country Old.var new.var 1 2001 A 12 12 2 2002 A 26 12 3 2003 A 14 12 4 2004 A 9 12 5 2005 A 7 12 6 2006 A 42 42 7 2007 A 13 42 8 2008 A 12 42 9 2009 A 24 42 10 2010 A 13 42 11 2001 B 19 19 12 2002 B 32 19 13 2003 B 44 19 14 2004 B 63 19 15 2005 B 24 19 16 2006 B 12 12 17 2007 B 16 12 18 2008 B 9 12 19 2009 B 10 12 20 2010 B 5 12
解决方案
方法1:使用dplyr包(推荐)
先安装并加载dplyr,按country分组后创建每5行一组的块标识,再提取每个块的首行Old.var值填充整个块:
library(dplyr) df <- df %>% group_by(country) %>% mutate( block = (row_number() - 1) %/% 5, new.var = first(Old.var[block == cur_group()$block]) ) %>% ungroup() %>% select(-block) # 可选择删除临时的block列
方法2:使用data.table包(适合大数据场景)
如果数据量较大,data.table的处理效率更优:
library(data.table) setDT(df) df[, new.var := Old.var[1], by = .(country, (seq_len(.N)-1) %/% 5)]
方法3:基础R实现
无需额外安装包,用ave函数结合分组逻辑完成:
df$new.var <- ave( df$Old.var, df$country, (ave(seq_len(nrow(df)), df$country, FUN = seq_along) - 1) %/% 5, FUN = function(x) x[1] )
内容的提问来源于stack exchange,提问作者jay
相关产品推荐
相关产品推荐

