【问题标题】:How to create objects named after function parameters and rbind them all?如何创建以函数参数命名的对象并将它们全部绑定?
【发布时间】:2020-07-06 02:36:06
【问题描述】:

我的目标是自动化巴西家庭调查中的一些数据实现和分析。为此,第一步是创建一个函数,用于下载和绑定多个版本的住户调查。 好处是我已经有一个下载不同版本的家庭调查的功能。它被称为“PNADcIBGE::get_pnadc”。此函数获取参数“年”和“季度”。所以,做这件事的路很长:

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:\IBGE\pnadc_&i._&j..csv"
        out=pnadc_&i._&j.
        dbms=csv
        replace;
%end;
%end;

%do k=1 %to &t.;
proc import datafile="H:\IBGE\pnadc_&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 中获得类似内容的任何想法?

【问题讨论】:

  • pnad_2012_1 属于list 类,包含大量信息。您是否要提取其中一个元素和rbind 那些?
  • 嗨罗纳克沙阿,感谢您的评论。根据我的教程(仅限葡萄牙语) pnad_2012_1 应该是 survey.design 对象。是的,有很多信息。可能我会进一步只选择它的一些列。但你是对的。我希望它们应该有大约 300k 行和大约 100 列。
  • 我只能选择几个变量来使其更小: Pnadc_2012_1

标签: r function rbind


【解决方案1】:

问题在于运算符优先级。 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

【讨论】:

  • 非常感谢!!!你在这个问题上肯定是对的!显然它现在正在工作!它仍在运行,预计需要一段时间,因为它们是几个大型数据集。我将等待。在此期间,您对问题的第二部分有什么想法吗?关于如何 rbind 所有生成的对象而不需要全部列出?
【解决方案2】:

您可以使用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'))

【讨论】:

  • 非常感谢您分享代码和知识!我承认我仍在研究 expand.grid 并申请。但我有一个大致的想法,它似乎确实有效。但是,我仍然无法得到最终结果。也许数据集太大而无法通过单个循环完成所有操作。不过我有 16GB,我可以在 WPS/SAS 中完成。它运行了几个小时,有时我收到一条错误消息,指出我复制和解压缩文件的文件夹不再存在。也许我在循环中做错了什么。我会继续努力弄清楚。再次感谢您。
  • 一旦我能得到结果,我会在这里发布。不幸的是,还没有。
猜你喜欢
  • 2011-08-27
  • 1970-01-01
  • 1970-01-01
  • 2011-06-08
  • 2011-08-04
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多