我的目标是自动化巴西家庭调查的一些数据实现和分析。为此,第一步是创建一个函数,用于下载和绑定多个版本的住户调查。 好的一点是,我已经有一个功能可以下载单独版本的家庭调查。它被称为"PNADcIBGE::get_pnadc"。此函数获取参数"year"和"quarter"。因此,漫长的路要走:
install.package("PNADcIBGE")
library(PNADcIBGE)
pnad_2012_1 <- get_pnadc(year = 2012, quarter = 1)
pnad_2012_2 <- get_pnadc(year = 2012, quarter = 2)
pnad_2012_3 <- get_pnadc(year = 2012, quarter = 3)
pnad_2012_4 <- get_pnadc(year = 2012, quarter = 4)
pnad_2013_1 <- get_pnadc(year = 2012, quarter = 1)
这段代码会继续...最多year = 2020 and quarter = 1
.
加载所有数据并相应地命名后,我想对所有数据进行行绑定:
pnad_final <- rbind(pnad_2012_1, pnad_2012_2, ...., pnad_2020_1)
我不知道如何在 R 中做到这一点,我尝试过:
PCC <- function(a, t) {
for (i in 2012:a-1){
for(j in 1:4){
Pnadc_i_j <- get_pnadc(year = i , quarter = j)
}
}
for(k in 1:t){
Pnadc_a_k <- get_pnadc(year = a, quarter = k)
}
}
PCC(2020, 1)
但是后来我得到错误:
Error in get_pnadc(year = i, quarter = j) : Year must be greater or equal to 2012.
我以为我已经i
初始值设置为 2012 年,但显然我没有。
我是 R 的新手,但我可以在 SAS 中通过以下方式做同样的事情:
%macro PCC(a, t);
%do i=2012 %to %eval(&a.-1);
%do j=1 %to 4;
proc import datafile="H:IBGEpnadc_&i._&j..csv"
out=pnadc_&i._&j.
dbms=csv
replace;
%end;
%end;
%do k=1 %to &t.;
proc import datafile="H:IBGEpnadc_&a._&k..csv"
out=pnadc_&a._&k.
dbms=csv
replace;
%end;
%mend;
%PCC(2020, 1);
/*And finally, the row-bind is super easy*/
data pnad_final;
set pnadc_20:;
run;
关于如何在 R 中获得类似内容的任何想法?
问题在于运算符优先级。您在for (i in 2012:a-1)
中缺少一些括号。它应该是for (i in 2012:(a-1)
(。您编写它的方式创建了从 2012 到a
的向量,然后从每个元素中减去 1,因为:
运算符的优先级高于-
。这使得i
的第一个值为 2011,从而产生该错误。
例:
a <- 2020
2012:a-1
# [1] 2011 2012 2013 2014 2015 2016 2017 2018 2019
2012:(a-1)
# [1] 2012 2013 2014 2015 2016 2017 2018 2019
您可以使用expand.grid
创建所有数据组合,并使用lapply
将get_pnadc
函数应用于每个组合。
library(PNADcIBGE)
data <- expand.grid(year = 2012:2019, quarter = 1:4)
all_data <- lapply(seq(nrow(data)), function(i)
get_pnadc(year = data$year[i], y = data$quarter[i]))
all_data
将是survey.design
对象的列表。您可以根据需要仅提取其中的相关部分。例如,您只能从每个数据帧中提取variable
并将它们合并到一个数据帧中。
new_data <- do.call(rbind, lapply(all_data, `[[`, 'variables'))