我正在尝试将来自欧洲社会调查的许多Stata文件合并到R中的一个数据框架中.Stata文件来自不同年份,并存储在遵循某种逻辑的不同文件夹中 - 'C:\ data \ ess \ 2002','C:\ data \ ess \ 2004',依此类推。但是,这些文件没有一致的名称。但它们都有我感兴趣的相同变量。对于每个文件,我想计算各国的加权平均值,并按以下方式添加有关年份的信息:
library(tidyverse)
library(haven)
ess2002 <- read_dta("C:/data/ESS/2002/ESS1e06_4.dta") %>%
select(cntry, pspwght, starts_with('ppl') ) %>%
group_by(cntry) %>%
summarize(ppltrst = weighted.mean(ppltrst, pspwght, na.rm = TRUE),
pplfair = weighted.mean(pplfair, pspwght, na.rm = TRUE),
pplhlp = weighted.mean(pplhlp, pspwght, na.rm = TRUE)) %>%
mutate(year = 2002)
然后,我希望通过附加数据帧,例如,将所有年份的数据组合成一个数据帧。 ess <- bind_rows(ess2002, ess2004, ...)
。这种方法很好,但它并不优雅。我假设我可以将文件名和年份存储在向量中并循环遍历它们或以某种方式使用purrr,但我还没弄清楚如何。一个问题是我不希望同时在内存中没有所有完整的Stata数据集,因此我想在读取下一个文件之前从一个文件中选择相关变量。
有人能帮我找到更优雅的解决方案吗?任何帮助将不胜感激。
答案 0 :(得分:1)
要使用purrr
,您可以将汇总步骤概括为单个函数:
summarize_dta <- . %>%
read_dta() %>%
select(cntry, pspwght, starts_with('ppl') ) %>%
group_by(cntry) %>%
summarize(ppltrst = weighted.mean(ppltrst, pspwght, na.rm = TRUE),
pplfair = weighted.mean(pplfair, pspwght, na.rm = TRUE),
pplhlp = weighted.mean(pplhlp, pspwght, na.rm = TRUE))
然后创建一个tibble或数据框,每年有一列和相应的.dta文件(file_name
)。然后你应该能够做到这一点:
df %>%
mutate(data = map(file_name, summarize_dta)) %>%
unnest()