r语言 - 循环遍历子列表,其中"sub sub"列表保持不变



我想遍历一个子列表,其中"sub sub"列表保持不变。我提到的所有代码都只是可重现的示例(请注意,实际数据非常大(,应该可以毫无问题地工作。

我有一个列表列表,每个列表有 2 个子列表,如下所示:

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
)
# Creates a list
df_iso <- split(df, df$iso) # Creates a list of dataframes
# Creates a list of lists
mylist.names <- names(df_iso)
df_iso_list <- vector("list", length(mylist.names))
names(df_iso_list) <- mylist.names
f <- function(x) return(list(a = list(), b = list()))
new_nested <- lapply(df_iso, f)

现在new_nested$AUS$a访问子列表AUS的列表a。目前为止,一切都好。

我想将下面的两个列表(df_iso_1, df_iso_2(重新分发到我刚刚创建的列表结构中。

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")})
}
names(df_iso_1) <- names(df_iso)
names(df_iso_2) <- names(df_iso)

尽管new_nested$AUS$a访问该列表,但我想使用索引循环浏览iso代码,而不是按名称引用它们:

for (n in length(df_iso)) {
new_nested$[i]$a <- df_iso_1[n]
}

但是,这不起作用。循环浏览这些列表的正确语法是什么?

期望输出:

df_iso_1df_iso_2mids对象是按iso代码池化的。换句话说,所有iso代码都放在新结构中:

因此,new_nested的列表NLD填充了来自df_iso_1df_iso_2的 NLDmids对象,其列表列表AUS填充了来自df_iso_1df_iso_2的 AUSmids对象。

这里有两种方法。第一种是用seq_len(length(df_iso))修复循环并匹配输出,将df_iso_1[n]更改为df_iso1[[n]]

for (n in seq_len(length(df_iso))) {
new_nested[[names(df_iso)[n]]]$a <- df_iso_1[[n]] 
new_nested[[names(df_iso)[n]]]$b <- df_iso_2[[n]]
}
new_nested$AUS$a
Class: mids
Number of multiple imputations:  1 
Imputation methods:
A    B    C    D    E    F  iso year 
""   ""   ""   ""   ""   ""   ""   "" 
PredictorMatrix:
A B C D E F iso year
A 0 0 0 0 0 0   0    1
B 0 0 0 0 0 0   0    0
C 0 0 0 0 0 0   0    0
D 1 0 0 0 0 0   0    1
E 0 0 0 0 0 0   0    0
F 0 0 0 0 0 0   0    0
Number of logged events:  6 
it im dep      meth out
1  0  0      constant   B
2  0  0      constant   C
3  0  0      constant   E
4  0  0      constant   F
5  0  0      constant iso
6  0  0     collinear   D

第二种方法是使用mapply遍历df_iso_n列表的每个元素,以将它们组合成一个新的列表矩阵:

mapply(list, df_iso_1, df_iso_2)
#     AUS     BRA     ECU     NLD    
#[1,] List,21 List,21 List,21 List,21
#[2,] List,21 List,21 List,21 List,21
mapply(list, df_iso_1, df_iso_2)[, 'AUS']
[[1]]
Class: mids
Number of multiple imputations:  1 
Imputation methods:
A    B    C    D    E    F  iso year 
""   ""   ""   ""   ""   ""   ""   "" 
PredictorMatrix:
A B C D E F iso year
A 0 0 0 0 0 0   0    1
B 0 0 0 0 0 0   0    0
C 0 0 0 0 0 0   0    0
D 1 0 0 0 0 0   0    1
E 0 0 0 0 0 0   0    0
F 0 0 0 0 0 0   0    0
Number of logged events:  6 
it im dep      meth out
1  0  0      constant   B
2  0  0      constant   C
3  0  0      constant   E
4  0  0      constant   F
5  0  0      constant iso
6  0  0     collinear   D
[[2]]
Class: mids
Number of multiple imputations:  1 
Imputation methods:
A    B    C    D    E    F  iso year 
""   ""   ""   ""   ""   ""   ""   "" 
PredictorMatrix:
A B C D E F iso year
A 0 0 0 0 0 0   0    1
B 0 0 0 0 0 0   0    0
C 0 0 0 0 0 0   0    0
D 1 0 0 0 0 0   0    1
E 0 0 0 0 0 0   0    0
F 0 0 0 0 0 0   0    0
Number of logged events:  6 
it im dep      meth out
1  0  0      constant   B
2  0  0      constant   C
3  0  0      constant   E
4  0  0      constant   F
5  0  0      constant iso
6  0  0     collinear   D

此外,考虑重构代码仍然是一个好主意。这在很大程度上在 3 行中完成所有操作:

seeds = c(1,2)
by(data = df, INDICES = df$iso,
FUN = function(ISO) lapply(seeds, function(seed) mice(ISO, m = 1, maxit = 5, seed = seed)))
df$iso: AUS
[[1]]
Class: mids
Number of multiple imputations:  1 
Imputation methods:
A    B    C    D    E    F  iso year 
""   ""   ""   ""   ""   ""   ""   "" 
PredictorMatrix:
A B C D E F iso year
A 0 0 0 0 0 0   0    1
B 0 0 0 0 0 0   0    0
C 0 0 0 0 0 0   0    0
D 1 0 0 0 0 0   0    1
E 0 0 0 0 0 0   0    0
F 0 0 0 0 0 0   0    0
Number of logged events:  6 
it im dep      meth out
1  0  0      constant   B
2  0  0      constant   C
3  0  0      constant   E
4  0  0      constant   F
5  0  0      constant iso
6  0  0     collinear   D
[[2]]
Class: mids
Number of multiple imputations:  1 
Imputation methods:
A    B    C    D    E    F  iso year 
""   ""   ""   ""   ""   ""   ""   "" 
PredictorMatrix:
A B C D E F iso year
A 0 0 0 0 0 0   0    1
B 0 0 0 0 0 0   0    0
C 0 0 0 0 0 0   0    0
D 1 0 0 0 0 0   0    1
E 0 0 0 0 0 0   0    0
F 0 0 0 0 0 0   0    0
Number of logged events:  6 
it im dep      meth out
1  0  0      constant   B
2  0  0      constant   C
3  0  0      constant   E
4  0  0      constant   F
5  0  0      constant iso
6  0  0     collinear   D
---------------------------------------------------- 
df$iso: BRA
[[1]]
...

最新更新