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