我有一个包含 960 个观测值的面板数据框,我想创建一个新变量,其中包含按国家/地区每五行的第一行。
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
我需要创建一个名为 new.var 的新列,其中包含每五行中的第一行
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 除以 5 的整数部分,然后按该行和国家/地区进行分组,并按组分配
Old.var
的第一个值。例如,使用 dplyr
:
library(dplyr)
df |>
mutate(
grp = (row_number() - 1) %/% 5,
.by = country
) |>
mutate(
new.var = first(Old.var), .by = c(country, grp)
)
# year country Old.var grp new.var
# 1 2001 A 12 0 12
# 2 2002 A 26 0 12
# 3 2003 A 14 0 12
# 4 2004 A 9 0 12
# 5 2005 A 7 0 12
# 6 2006 A 42 1 42
# 7 2007 A 13 1 42
# 8 2008 A 12 1 42
# 9 2009 A 24 1 42
# 10 2010 A 13 1 42
# 11 2001 B 19 0 19
# 12 2002 B 32 0 19
# 13 2003 B 44 0 19
# 14 2004 B 63 0 19
# 15 2005 B 24 0 19
# 16 2006 B 12 1 12
# 17 2007 B 16 1 12
# 18 2008 B 9 1 12
# 19 2009 B 10 1 12
# 20 2010 B 5 1 12
您可能想要删除
grp
列,但我将其保留在其中,以便更清楚地了解此方法的工作原理。