首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >加载多个.dta文件,选择变量

加载多个.dta文件,选择变量
EN

Stack Overflow用户
提问于 2020-05-25 10:38:44
回答 1查看 432关注 0票数 0

我有多个Stata文件,我想作为单独的数据读取,从每个文件中选择特定的变量。

这些档案是:

代码语言:javascript
复制
a_hhresp.dta
b_hhresp.dta
c_hhresp.dta
d_hhresp.dta
etc.

我希望从每个变量中获得以下变量:

代码语言:javascript
复制
a_hidp, a_fihhmnnet1_dv, a_ieqmoecd_dv
b_hidp, b_fihhmnnet1_dv, b_ieqmoecd_dv
etc.

以下是我目前的情况:

代码语言:javascript
复制
hh1 <- read_dta("a_hhresp.dta", col_select=c("a_hidp", "a_fihhmnnet1_dv", "a_ieqmoecd_dv"))
hh2 <- read_dta("b_hhresp.dta", col_select=c("b_hidp", "b_fihhmnnet1_dv", "b_ieqmoecd_dv"))
hh3 <- read_dta("c_hhresp.dta", col_select=c("c_hidp", "c_fihhmnnet1_dv", "c_ieqmoecd_dv"))
hh4 <- read_dta("d_hhresp.dta", col_select=c("d_hidp", "d_fihhmnnet1_dv", "d_ieqmoecd_dv"))
hh5 <- read_dta("e_hhresp.dta", col_select=c("e_hidp", "e_fihhmnnet1_dv", "e_ieqmoecd_dv"))
hh6 <- read_dta("f_hhresp.dta", col_select=c("f_hidp", "f_fihhmnnet1_dv", "f_ieqmoecd_dv"))
hh7 <- read_dta("g_hhresp.dta", col_select=c("g_hidp", "g_fihhmnnet1_dv", "g_ieqmoecd_dv"))
hh8 <- read_dta("h_hhresp.dta", col_select=c("h_hidp", "h_fihhmnnet1_dv", "h_ieqmoecd_dv"))
hh9 <- read_dta("i_hhresp.dta", col_select=c("i_hidp", "i_fihhmnnet1_dv", "i_ieqmoecd_dv"))

当然,这是糟糕的形式,不必要的复制粘贴--应该可以通过一两行迭代来完成。如果我能想出如何为这个组件做这件事,那么也许我也可以用我所学到的来更有效地完成其他任务。

我想使用(首先创建了一个文件列表) --但我看不到在初始阶段选择列的方法。

我试图避免为这样的任务分别写行--谢谢你的建议。

编辑

这是一个大型面板数据集(“理解社会”,在英国),有9波(到目前为止)和多个文件每波。我上面描述的数据对应于家庭层面的数据。

创建列表("listhh")之后,我可以应用:

代码语言:javascript
复制
dfhh <- lapply(listhh, function(x) read_dta(x))

这是可行的,但是它需要所有的变量--所以,数据的列表非常大。

当使用lapply时,我没有看到任何与col_select选项一起工作的东西--因为每个文件的变量前缀是不同的。

我可以用lapply加载所有文件(包含所有变量),然后将其转换为dataframe:

代码语言:javascript
复制
dfhh <- rbindlist(dfhh, fill = TRUE)

然后,我只能选择我想要的列:

代码语言:javascript
复制
dfhh %<>% select(grep("([a-z])_hidp", names(dfhh)), grep("([a-z])_fihhmnnet1_dv", names(dfhh)), grep("([a-z])_ieqmoecd_dv", names(dfhh)))

这个很管用。但是当涉及到单个级别的文件时,所有的内容都要大得多。当我对单个文件尝试相同的方法时,我会得到一个“致命错误”,并且必须重新启动R。

在读取数据时最好选择列.

进一步编辑

我认为最好还是将文件读入单独的数据文件中。我必须将家庭数据与个人数据合并,使用特定于波形的键(对于Wave A,关键是: by="a_hidp")。如果我有一个包含所有家庭数据的数据,那么就没有唯一的密钥了--我现在有了a_hidp、b_hidp、c_hidp等等。我想我需要9个单独的家庭级数据,以及9个相应的个人级数据。在波浪中合并,然后加入波浪。

EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2020-05-27 11:16:07

我终于想出了正确的办法。下面的代码工作,加载所有相关数据集,选择我想要的变量,并从列表中提取数据格式(为列表中的元素分配了名称):

代码语言:javascript
复制
#create list
listhh <- list.files("path", pattern = "*_hhresp.dta")

#read the files
uh <- lapply(listhh, read_dta)

#select variables:
uh <- lapply(uh, function(x) x%>% select(ends_with("_hidp"),
                                         ends_with("_fihhmnnet1_dv"),
                                         ends_with("_ieqmoecd_dv")))

#name the list elements:
names(uh) <- gsub("\\.dta$", "", listhh)

#extract the individual dataframes from the list
list2env(uh, .GlobalEnv)

感谢大卫让我继续这么做。

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/62000700

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档