将列表的对象移动到另一个列表
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_1
和 df_iso_2
的 mids
对象移动到另一个列表,该列表具有 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()
函数在一行中包含 split
和 lapply
。
#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 iso
s。
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
我有 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_1
和 df_iso_2
的 mids
对象移动到另一个列表,该列表具有 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()
函数在一行中包含 split
和 lapply
。
#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 iso
s。
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