将列表的对象移动到另一个列表

Moving objects of a list to another list

我有 mids 个由 mice 库创建的对象列表,如下所示:

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_1df_iso_2mids 对象移动到另一个列表,该列表具有 ISO 代码的名称(这会生成具有相同 iso 代码的 mids 对象列表,而不是包含所有 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

关于如何正确执行此操作的任何建议?

编辑:使用 Cole 的回答,我想我想实现以下目标:

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。

你想要:

names(df_iso_1) <- names(df_iso)
NLD[[1]] <- df_iso_1[['NLD']]

我们需要克服 df_iso_1 没有任何名称作为子集依据的问题。另一种方法是嵌套 lapply 语句并循环遍历 df_iso 和我们想要的任何种子。

seeds = c(1,2)
df_iso_all <- lapply(df_iso,
                     function(ISO) lapply(seeds,
                                          function(seed) mice(ISO, m=1, maxit = 5, seed = seed)
                                          )
                     )

df_iso_all[['NLD']]

我们还可以使用 by() 函数在一行中包含 splitlapply

#or split using by an do it at once:
by(data = df, INDICES = df$iso,
   FUN = function(ISO) lapply(seeds, function(seed) mice(ISO, m = 1, maxit = 5, seed = seed)))

您甚至可以提前将一些错误处理包含在数据处理中,以便只有 1,000 isos。

df[, GRPING := .GRP, by = iso]
by(data = df[GRPING < 1000, !c('GRPING')],
   ...,
   ...)

这是在我的计算机上运行的代码的复制和粘贴:

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")})
}

NLD = list()
AUS = list()
ECU = list()
BRA = list()

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']]
  AUS[[n]] <- x[['AUS']]
  ECU[[n]] <- x[['ECU']]
  BRA[[n]] <- x[['BRA']]
}

NLD
AUS
ECU
BRA