推断从去年到给定年份可用的行
Extrapollate rows from the last year available up until a given year
我有以下数据:
library(data.table)
df <- fread(
"A B C D E F iso year
0 A NA 1 NA NA NLD 2009
1 Y NA 2 NA NA NLD 2010
0 Q NA 3 NA NA AUS 2011
1 NA NA 4 NA NA AUS 2012
0 0 NA 7 NA NA NLD 2011
0 NA 1 NA 1 NA ECU 2009
1 NA 0 NA 2 0 ECU 2010
1 NA 0 NA 2 0 ECU 2011
0 NA 0 NA 3 2 BRA 2011
1 NA 0 NA 4 NA BRA 2012",
header = TRUE
)
我想为每个国家/地区推断数据集中最后一年的条目,直至特定年份。例如,我想使用 df
中每个国家的最后一年(NLD=2011,AUS=2012,BRA=2012,ECU=2011),创建到 2014 年的条目。换句话说,我会喜欢复制这些条目,但随着年份的变化,直到 2014 年的最后一个可用年份。
期望的输出:
library(data.table)
df <- fread(
"A B C D E F iso year
0 A NA 1 NA NA NLD 2009
1 Y NA 2 NA NA NLD 2010
0 Q NA 3 NA NA AUS 2011
1 NA NA 4 NA NA AUS 2012
1 NA NA 4 NA NA AUS 2013
1 NA NA 4 NA NA AUS 2014
0 0 NA 7 NA NA NLD 2011
0 0 NA 7 NA NA NLD 2012
0 0 NA 7 NA NA NLD 2013
0 0 NA 7 NA NA NLD 2014
0 NA 1 NA 1 NA ECU 2009
1 NA 0 NA 2 0 ECU 2010
0 NA 0 NA 3 0 BRA 2011
1 NA 0 NA 4 0 BRA 2011
1 NA 0 NA 2 0 ECU 2011
1 NA 0 NA 2 0 ECU 2012
1 NA 0 NA 2 0 ECU 2013
1 NA 0 NA 2 0 ECU 2014
0 NA 0 NA 3 2 BRA 2011
1 NA 0 NA 4 NA BRA 2012
1 NA 0 NA 4 NA BRA 2013
1 NA 0 NA 4 NA BRA 2014",
header = TRUE
)
但我真的不知道从哪里开始。最简单的方法是什么?
编辑:在对实际数据进行测试时,我注意到在表述问题时我忽略了数据集的一个方面。在实际数据集中,除了年份之外,行中还有一个独特的方面(A 列)。
library(data.table)
df <- fread(
"A B C D E F iso year
1 A NA 1 NA NA NLD 2009
1 Y NA 2 NA NA NLD 2010
1 Q NA 3 NA NA AUS 2011
1 NA NA 4 NA NA AUS 2012
1 0 NA 7 NA NA NLD 2011
1 NA 1 NA 1 NA ECU 2009
1 NA 0 NA 2 0 ECU 2010
1 NA 0 NA 2 0 ECU 2011
1 NA 0 NA 3 2 BRA 2011
1 NA 0 NA 4 NA BRA 2012
0 A NA 1 NA NA NLD 2009
0 Y NA 2 NA NA NLD 2010
0 Q NA 3 NA NA AUS 2011
0 NA NA 4 NA NA AUS 2012
0 0 NA 7 NA NA NLD 2011
0 NA 1 NA 1 NA ECU 2009
0 NA 0 NA 2 0 ECU 2010
0 NA 0 NA 2 0 ECU 2011
0 NA 0 NA 3 2 BRA 2011
0 NA 0 NA 4 NA BRA 2012",
header = TRUE
)
我尝试在这方面调整 Ronak 的结果:
df <- df %>%
group_by(iso, A) %>%
slice(c(1:n(), rep(n(), 2014 - last(year)))) %>%
mutate(year = first(year):2014)
###
df <- df %>%
#If not arranged by year
arrange(iso, year, A)
group_by(iso) %>%
complete(year = seq(min(year), 2014)) %>%
fill(B:F)
上面的代码有效,但在我的实际数据上给出了错误:
Error: Column `year` must be length 18 (the group size) or one, not 21
底部选项应用于示例时出现以下错误:
Error in group_by(iso) : object 'iso' not found
要复制最后一行,我们可以 group_by
iso
并在每个组中重复最后一行
df %>%
group_by(iso) %>%
slice(c(1:n(), rep(n(), 2014 - last(year)))) %>%
mutate(year = first(year):2014)
对于更新后的数据,其中 year
个值重复
df %>%
group_by(iso) %>%
mutate(row = row_number()) %>%
slice(row, rep(n(), 2014 - last(year))) %>%
mutate(year = c(year[1:max(row)], year[max(row)] + 1:(2014 - year[max(row)]))) %>%
select(-row)
# A B C D E F iso year
# <int> <chr> <int> <int> <int> <int> <chr> <int>
# 1 1 Q NA 3 NA NA AUS 2011
# 2 1 NA NA 4 NA NA AUS 2012
# 3 0 Q NA 3 NA NA AUS 2011
# 4 0 NA NA 4 NA NA AUS 2012
# 5 0 NA NA 4 NA NA AUS 2013
# 6 0 NA NA 4 NA NA AUS 2014
# 7 1 NA 0 NA 3 2 BRA 2011
# 8 1 NA 0 NA 4 NA BRA 2012
# 9 0 NA 0 NA 3 2 BRA 2011
#10 0 NA 0 NA 4 NA BRA 2012
# … with 20 more rows
我有以下数据:
library(data.table)
df <- fread(
"A B C D E F iso year
0 A NA 1 NA NA NLD 2009
1 Y NA 2 NA NA NLD 2010
0 Q NA 3 NA NA AUS 2011
1 NA NA 4 NA NA AUS 2012
0 0 NA 7 NA NA NLD 2011
0 NA 1 NA 1 NA ECU 2009
1 NA 0 NA 2 0 ECU 2010
1 NA 0 NA 2 0 ECU 2011
0 NA 0 NA 3 2 BRA 2011
1 NA 0 NA 4 NA BRA 2012",
header = TRUE
)
我想为每个国家/地区推断数据集中最后一年的条目,直至特定年份。例如,我想使用 df
中每个国家的最后一年(NLD=2011,AUS=2012,BRA=2012,ECU=2011),创建到 2014 年的条目。换句话说,我会喜欢复制这些条目,但随着年份的变化,直到 2014 年的最后一个可用年份。
期望的输出:
library(data.table)
df <- fread(
"A B C D E F iso year
0 A NA 1 NA NA NLD 2009
1 Y NA 2 NA NA NLD 2010
0 Q NA 3 NA NA AUS 2011
1 NA NA 4 NA NA AUS 2012
1 NA NA 4 NA NA AUS 2013
1 NA NA 4 NA NA AUS 2014
0 0 NA 7 NA NA NLD 2011
0 0 NA 7 NA NA NLD 2012
0 0 NA 7 NA NA NLD 2013
0 0 NA 7 NA NA NLD 2014
0 NA 1 NA 1 NA ECU 2009
1 NA 0 NA 2 0 ECU 2010
0 NA 0 NA 3 0 BRA 2011
1 NA 0 NA 4 0 BRA 2011
1 NA 0 NA 2 0 ECU 2011
1 NA 0 NA 2 0 ECU 2012
1 NA 0 NA 2 0 ECU 2013
1 NA 0 NA 2 0 ECU 2014
0 NA 0 NA 3 2 BRA 2011
1 NA 0 NA 4 NA BRA 2012
1 NA 0 NA 4 NA BRA 2013
1 NA 0 NA 4 NA BRA 2014",
header = TRUE
)
但我真的不知道从哪里开始。最简单的方法是什么?
编辑:在对实际数据进行测试时,我注意到在表述问题时我忽略了数据集的一个方面。在实际数据集中,除了年份之外,行中还有一个独特的方面(A 列)。
library(data.table)
df <- fread(
"A B C D E F iso year
1 A NA 1 NA NA NLD 2009
1 Y NA 2 NA NA NLD 2010
1 Q NA 3 NA NA AUS 2011
1 NA NA 4 NA NA AUS 2012
1 0 NA 7 NA NA NLD 2011
1 NA 1 NA 1 NA ECU 2009
1 NA 0 NA 2 0 ECU 2010
1 NA 0 NA 2 0 ECU 2011
1 NA 0 NA 3 2 BRA 2011
1 NA 0 NA 4 NA BRA 2012
0 A NA 1 NA NA NLD 2009
0 Y NA 2 NA NA NLD 2010
0 Q NA 3 NA NA AUS 2011
0 NA NA 4 NA NA AUS 2012
0 0 NA 7 NA NA NLD 2011
0 NA 1 NA 1 NA ECU 2009
0 NA 0 NA 2 0 ECU 2010
0 NA 0 NA 2 0 ECU 2011
0 NA 0 NA 3 2 BRA 2011
0 NA 0 NA 4 NA BRA 2012",
header = TRUE
)
我尝试在这方面调整 Ronak 的结果:
df <- df %>%
group_by(iso, A) %>%
slice(c(1:n(), rep(n(), 2014 - last(year)))) %>%
mutate(year = first(year):2014)
###
df <- df %>%
#If not arranged by year
arrange(iso, year, A)
group_by(iso) %>%
complete(year = seq(min(year), 2014)) %>%
fill(B:F)
上面的代码有效,但在我的实际数据上给出了错误:
Error: Column `year` must be length 18 (the group size) or one, not 21
底部选项应用于示例时出现以下错误:
Error in group_by(iso) : object 'iso' not found
要复制最后一行,我们可以 group_by
iso
并在每个组中重复最后一行
df %>%
group_by(iso) %>%
slice(c(1:n(), rep(n(), 2014 - last(year)))) %>%
mutate(year = first(year):2014)
对于更新后的数据,其中 year
个值重复
df %>%
group_by(iso) %>%
mutate(row = row_number()) %>%
slice(row, rep(n(), 2014 - last(year))) %>%
mutate(year = c(year[1:max(row)], year[max(row)] + 1:(2014 - year[max(row)]))) %>%
select(-row)
# A B C D E F iso year
# <int> <chr> <int> <int> <int> <int> <chr> <int>
# 1 1 Q NA 3 NA NA AUS 2011
# 2 1 NA NA 4 NA NA AUS 2012
# 3 0 Q NA 3 NA NA AUS 2011
# 4 0 NA NA 4 NA NA AUS 2012
# 5 0 NA NA 4 NA NA AUS 2013
# 6 0 NA NA 4 NA NA AUS 2014
# 7 1 NA 0 NA 3 2 BRA 2011
# 8 1 NA 0 NA 4 NA BRA 2012
# 9 0 NA 0 NA 3 2 BRA 2011
#10 0 NA 0 NA 4 NA BRA 2012
# … with 20 more rows