【发布时间】:2020-01-12 01:33:45
【问题描述】:
我有由mice 库创建的mids 对象列表,如下所示:
library(data.table)
library(mice)
df <- fread(
"A B C D E F iso year
0 A NA 1 NA NA NLD 2009
1 Y NA 2 NA NA NLD 2009
0 Q NA 3 NA NA AUS 2011
1 NA NA 4 NA NA AUS 2011
0 0 NA 7 NA NA NLD 2008
1 1 NA 1 NA NA NLD 2008
0 1 NA 3 NA NA AUS 2012
0 NA 1 NA 1 NA ECU 2009
1 NA 0 NA 2 0 ECU 2009
0 NA 0 NA 3 0 BRA 2011
1 NA 0 NA 4 0 BRA 2011
0 NA 1 NA 7 NA ECU 2008
1 NA 0 NA 1 0 ECU 2008
0 NA 0 NA 3 2 BRA 2012
1 NA 0 NA 4 NA BRA 2012",
header = TRUE
)
# 1. Split df into smaller df
df_iso <- split(df, df$iso) # Creates a list of dataframes
# 2. Impute smaller df, creates a list with mids
df_iso_1 = list()
for (i in 1:length(df_iso)) {
tryCatch({
df_iso_1 [[i]] <- mice(df_iso[[i]], m=1, maxit = 5, seed=1)
if (i==1000) stop("stop")
}, error=function(e){cat("ERROR :",conditionMessage(e), "\n")})
}
df_iso_2 = list()
for (i in 1:length(df_iso)) {
tryCatch({
df_iso_2 [[i]] <- mice(df_iso[[i]], m=1, maxit = 5, seed=2)
if (i==1000) stop("stop")
}, error=function(e){cat("ERROR :",conditionMessage(e), "\n")})
}
我希望能够简单地将列表 df_iso_1 和 df_iso_2 的 mids 对象移动到另一个列表,该列表具有 ISO 代码的名称(这导致列表 mids具有相同 iso 代码的对象,而不是具有所有 iso 代码的列表)。我尝试了以下方法:
NLD = list()
AUS = list()
ECU = list()
BRA = list()
for (n in 1:length(df_iso_1)){
if (df_iso_1[[i]]["data"]==NLD) {
NLD[[i]] <-
df_iso_1[[i]] }
}
然而这给出了错误:
Error in Ops.data.frame(df_iso_1[[i]], NLD) :
list of length 21 not meaningful
关于如何正确执行此操作的任何建议?
编辑:使用科尔的回答,我想我想实现以下目标:
names(df_iso_1) <- names(df_iso)
names(df_iso_2) <- names(df_iso)
for (n in 1:2) {
x <- get(paste0("df_iso_", n))
NLD[[n]] <- x[['NLD']]
}
由于某种原因,这只会将一项添加到 NLD 列表中。
【问题讨论】:
标签: r list for-loop data.table r-mice