Warning: file_get_contents(/data/phpspider/zhask/data//catemap/1/list/4.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
R 将列表中的对象移动到另一个列表_R_List_For Loop_Data.table_R Mice - Fatal编程技术网

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

R 将列表中的对象移动到另一个列表,r,list,for-loop,data.table,r-mice,R,List,For Loop,Data.table,R Mice,我有由鼠标库创建的mid对象列表,如下所示: 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

我有由
鼠标
库创建的
mid
对象列表,如下所示:

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")})
}
但是,这会产生以下错误:

Error in Ops.data.frame(df_iso_1[[i]], NLD) : 
  list of length 21 not meaningful
有没有关于如何正确地做到这一点的建议

编辑:根据科尔的回答,我想我应该做到以下几点:

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]] }
}
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']]
}
名称(df_iso_1)您想要:

names(df_iso_1) <- names(df_iso)
NLD[[1]] <- df_iso_1[['NLD']]
我们还可以使用
by()
函数在一行中包含
split
lappy

#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)))
您甚至可以将一些错误处理提前包含到数据处理中,使其仅具有1000个iso
s

df[, GRPING := .GRP, by = iso]
by(data = df[GRPING < 1000, !c('GRPING')],
   ...,
   ...)
df[,GRPING:=.GRP,by=iso]
通过(数据=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
库(data.table)
图书馆(mice)

非常感谢您的回答!这是一个巨大的帮助。有没有办法把结果提高一级?现在的结果是在[[1]]下有[NLD],但我需要[NLD]级别消失,信息直接在[[1]]下。可能吗?顺便问一下,是否有任何方法可以使用for循环执行此操作?请参见编辑。这一变化只是双括号:
df_iso_all[['NLD']]
。出于好奇,为什么您更喜欢将所有对象单独保存,而不是只保存一个列表?非常感谢!我就快到了,只是不知怎么的,我无法正确地获得for循环(请参见编辑)。我最初这样安排是为了在进行插补时节省内存。现在我必须把它放回到这个结构中,使
老鼠
能够汇集插补。事后看来,我认为还有更好的选择。@Tom,你的代码对我很有用。我复制并粘贴了我所有的代码。每个
iso
都是一个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
)

# 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