我有多个Stata文件,我想作为单独的数据读取,从每个文件中选择特定的变量。
这些档案是:
a_hhresp.dta
b_hhresp.dta
c_hhresp.dta
d_hhresp.dta
etc.我希望从每个变量中获得以下变量:
a_hidp, a_fihhmnnet1_dv, a_ieqmoecd_dv
b_hidp, b_fihhmnnet1_dv, b_ieqmoecd_dv
etc.以下是我目前的情况:
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")之后,我可以应用:
dfhh <- lapply(listhh, function(x) read_dta(x))这是可行的,但是它需要所有的变量--所以,数据的列表非常大。
当使用lapply时,我没有看到任何与col_select选项一起工作的东西--因为每个文件的变量前缀是不同的。
我可以用lapply加载所有文件(包含所有变量),然后将其转换为dataframe:
dfhh <- rbindlist(dfhh, fill = TRUE)然后,我只能选择我想要的列:
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个相应的个人级数据。在波浪中合并,然后加入波浪。
发布于 2020-05-27 11:16:07
我终于想出了正确的办法。下面的代码工作,加载所有相关数据集,选择我想要的变量,并从列表中提取数据格式(为列表中的元素分配了名称):
#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)感谢大卫让我继续这么做。
https://stackoverflow.com/questions/62000700
复制相似问题