微信公众号搜"智元新知"关注
微信扫一扫可直接关注哦!

R中的多文件处理,循环变量进行数据处理

如何解决R中的多文件处理,循环变量进行数据处理

我编写了几个函数来清理和处理来自美国社区调查 (ACS) 的 15 个样本。这个工作流程非常费力和重复:阅读每个文件,应用我的功能,然后继续下一个调查年。

我目前的工作流程是这样的:

library(tidyverse)
library(ids)
wage_2005 <- haven::read_dta("~/Data/ACS/2005_ACS.dta") %>%
  gen.wages(wage_2005) %>%
  reg.variables() %>%
  wage.adj(year = 2005) %>%
  wage.sample(year = 2005)

然后继续到 2006 年、2007 年,一直到 2019 年。例如,

wage_2006 <- haven::read_dta("~/Data/ACS/2006_ACS.dta") %>%
  gen.wages(wage_2006) %>%
  reg.variables() %>%
  wage.adj(year = 2006) %>%
  wage.sample(year = 2006)

我想要的是使用我的清理函数处理每个样本,迭代地循环遍历文件并使用每个文件中的 year 变量,以便对每个调查年份应用适当的处理,然后获取并存储结果列表中的每个调查年度。

作为第一步,我编写了一些代码,使用 sapply 函数读入文件

files <- list.files(path = "~/Data/ACS",full.names = TRUE)

data_files <- sapply(files,function(x) {
  df <- haven::read_dta(file = paste0(x)),USE.NAMES = TRUE,simplify = FALSE
                }
)

但这需要大量的存储空间,因为文件来自人口普查局并且非常大。我坚持下一步要迭代处理每个文件、应用我的函数并将结果存储在列表中。

一些伪代码让你更清楚:

  • 以年为单位
  • 读入数据文件
  • 应用函数
  • 存储结果

比如说我有三组数据,比如

acs_2005 <- 
  data.frame(id = random_id(n = 1000,bytes = 16,use_openssl = TRUE),wage = runif(1000,min = 0,max = 100),year = 2005)
acs_2006 <- 
  data.frame(id = random_id(n = 1000,year = 2006)

acs_2007 <- 
  data.frame(id = random_id(n = 1000,year = 2007)
data <- list(acs_2005,acs_2006,acs_2007)

假设它们将作为 csv 文件读取

lapply(1:length(data_list),function(i) write.csv(data_list[[i]],file = paste0(names(data_list[i]),".csv"),row.names = FALSE))

我的自定义函数是,

wage_summarize <- 
  function(df,year) {
    mutate(df,wage = case_when(
    year == 2005 ~ wage/0.7903,year == 2006 ~ wage/0.8112,year == 2007 ~ wage/0.8323)) %>%
    group_by(year) %>%
      summarize(wage = mean(wage,na.rm = TRUE))
  }

函数依赖于 year 变量以执行操作时,我将如何遍历此数据框列表?在这种情况下,假设根据通货膨胀进行调整?

在这方面的任何帮助或指导将不胜感激,谢谢!

解决方法

这应该作为您提供的信息的指导,

library(tidyverse)


# Simulate multiple data
# that has been loaded by some
# read_data-function
data_list <- list(
        mtcars,diamonds,iris
)


# Iterate through the list
# of data with some function
data_list <- data_list %>% map(
        .f = function(x) {
                
                x %>% mutate(
                        row_id = row_number()
                )
                
                
        }
)

这里我们加载了 data 并将其存储在一个列表中 - 它模拟我们一次读取一个数据。我们在使用 dplyr 时应用了一些函数。它输出相同长度的 list

有关对您的数据实施自定义 functions 的详细信息,请参阅 Programming with Dplyr

如果您想在 parallel 中执行此操作,这也是可能的 - 但这是特定于操作系统的。如果您在 UNIX,那么 mclapply() 是您的首选功能。

您要求提供一些指导,这就是我可以通过您提供的信息提供的信息。

,

为什么不将数据框列表合并为一个 -

library(dplyr)

bind_rows(data) %>% 
  mutate(wage = wage/case_when(
    year == 2005 ~ 0.7903,year == 2006 ~ 0.8112,year == 2007 ~ 0.8323)) %>%
  group_by(year) %>%
  summarise(wage = mean(wage,na.rm = TRUE))

#  year  wage
#  <dbl> <dbl>
#1  2005  63.0
#2  2006  61.9
#3  2007  59.8

版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。