从顺序数据帧(R)中提取过滤变量的函数
问题: 许多政府数据集(我使用的数据集)每年生成一次(横截面数据),按顺序标记为从顺序数据帧(R)中提取过滤变量的函数,r,R,问题: 许多政府数据集(我使用的数据集)每年生成一次(横截面数据),按顺序标记为.csv文件,并且在不同年份使用大致相同的变量集。这些数据集很大,有数百个柱状图和数千或数百万个案例。然而,通常我必须对仅从一部分案例的几个变量生成的指标进行时间趋势分析 例如,年度全国住户调查的信息可在名为“pnad_XXXX.csv”的文件中下载,其中“XXXX”由参考年份替换。同样的模式也适用于其他政府数据集,如学校普查、劳动力市场普查等 在“pnad”中,我需要生成一些跨时间的教育指标趋势分析,从名为“pna
.csv
文件,并且在不同年份使用大致相同的变量集。这些数据集很大,有数百个柱状图和数千或数百万个案例。然而,通常我必须对仅从一部分案例的几个变量生成的指标进行时间趋势分析
例如,年度全国住户调查的信息可在名为“pnad_XXXX.csv
”的文件中下载,其中“XXXX”由参考年份替换。同样的模式也适用于其他政府数据集,如学校普查、劳动力市场普查等
在“pnad”中,我需要生成一些跨时间的教育指标趋势分析,从名为“pnad_2004.csv
”到“pnad_2020.csv
”的文件。让我们假设教育变量是“var_3032”、“var_3033”、“var_3034”、“var_3035”、“var_3036”、“var_3037”,我还需要来自个人的一些信息,包含在变量“var_0321”、“var_0452”和“var_8878”中。我只需要年龄在5到19岁之间的个人(var_0321>4&var_0321<20
)
我所做的:
到目前为止,我所做的是分别打开17个文件中的每一个,选择我想要的变量,过滤数据并将其保存在一个对象中。之后,我行绑定所有17个对象。例如:
library(dplyr)
pnad_2004 <- read.csv("pnad_2004.csv") %>% select(var_0321, var_0452, var_8878, var_3032, var_3033, var_3034, var_3035, var_3036, var_3037) %>% filter (var_0321 > 4 & var_0321 < 20)
pnad_2005 <- read.csv("pnad_2005.csv") %>% select(var_0321, var_0452, var_8878, var_3032, var_3033, var_3034, var_3035, var_3036, var_3037) %>% filter (var_0321 > 4 & var_0321 < 20)
.
. (do the same for each one of the 17 files)
.
pnad_2020 <- read.csv("pnad_2020.csv") %>% select(var_0321, var_0452, var_8878, var_3032, var_3033, var_3034, var_3035, var_3036, var_3037) %>% filter (var_0321 > 4 & var_0321 < 20)
pnad_2004_2020 <- bind_rows(pnad_2004, pnad_2005, pnad_2006, ..., pnad_2020)
库(dplyr)
pnad_2004%选择(var_0321、var_0452、var_8878、var_3032、var_3033、var_3034、var_3035、var_3036、var_3037)%>%过滤器(var_0321>4和var_0321<20)
pnad_2005%选择(var_0321、var_0452、var_8878、var_3032、var_3033、var_3034、var_3035、var_3036、var_3037)%>%过滤器(var_0321>4和var_0321<20)
.
. (对17个文件中的每一个执行相同的操作)
.
pnad_2020%选择(var_0321、var_0452、var_8878、var_3032、var_3033、var_3034、var_3035、var_3036、var_3037)%>%过滤器(var_0321>4和var_0321<20)
pnad_2004_2020如果csv文件在R内的工作目录中,我们可以尝试此代码
library(stringr)
library(tidyverse)
pnad_vars <- c("var_0321", "var_0452", "var_8878", "var_3032", "var_3033", "var_3034", "var_3035", "var_3036", "var_3037")
#these names are located in a directory that can be set with setwd()
csv_names <- str_c('pnad_', as.character(seq(2004, 2020, 1)), '.csv')
global_names <- str_c('pnad_', as.character(seq(2004, 2020, 1)))
#for every name (eg: pnad_2015.csv) a global variable named the pnad_theYear
map2(csv_names, global_names, ~{
assign(..2, read.csv(..1) %>% select(pnad_vars) %>% filter(condition))
})
库(stringr)
图书馆(tidyverse)
pnad_vars如果你从列表中工作,它将工作得最好。要在函数示例中生成文件名向量,您需要执行以下操作:paste0(name,rep(first_year:last_year),“.csv”)
下面是一个填充列表的更完整的函数:
Your_list<-list() #empty to start
stack_data <- function(name, first_year, last_year, var_list, condition) {
#create the list of files you want
files<-paste0(name,rep(first_year:last_year),".csv")
#assign each read to index of a list
for i in 1:length(files) {
Your_list[[i]] <- read.csv(files[i]) %>% select(var_list) %>% filter(condition)
}
}
Your_list<-list() #empty to start
stack_data <- function(name, first_year, last_year, var_list, condition) {
#create the list of files you want
files<-paste0(name,rep(first_year:last_year),".csv")
#assign each read to index of a list
for i in 1:length(files) {
Your_list[[i]] <- read.csv(files[i]) %>% select(var_list) %>% filter(condition)
}
}
as.data.frame(matrix(unlist(Your_list),nrow=length(Your_list),byrow=TRUE)
library(tidyverse)
pnad_2004_2020 <- file_list%>%
map(~read.csv(.x) %>%
select(var_0321, var_0452, var_8878, var_3032, var_3033,
var_3034, var_3035, var_3036, var_3037) %>%
filter(var_0321 > 4 & var_0321 < 20), .id = 'file')
do.call(rbind,
lapply(file_list, function(x)
subset(read.csv(x),
var_0321 > 4 & var_0321 < 20
select = c(var_0321, var_0452, var_8878, var_3032, var_3033,
var_3034, var_3035, var_3036, var_3037))))