我正在使用ExtremeBounds包,它提供了一个多级列表,其中包含最低级别的数据帧。我在几个规范中运行此包,我想在这些结果中收集一些选定数据帧的列。这些应该通过规范(下面的示例中的spec1和spec2)收集并排列在数据帧列表中。然后,此数据框列表可用于所有类型的事物,例如将不同规范的结果导出到不同的Excel表格中。
以下是一些创建有问题对象的代码(盲目地运行此代码,我的问题仅涉及如何处理它创建的列表类型:eba_results ):
library("ExtremeBounds")
Data <- data.frame(var1=rbinom(30,1,0.2),var2=rbinom(30,2,0.2),
var3=rnorm(30),var4=rnorm(30),var5=rnorm(30))
spec1 <- list(y=c("var1"),
freevars=c("var2"),
doubtvars=c("var3","var4"))
spec2 <- list(y=c("var1"),
freevars=c("var2"),
doubtvars=c("var3","var4","var5"))
indicators <- c("spec1","spec2")
ebaFun <- function(x){
eba <- eba(data=Data, y=x$y,
free=x$freevars,
doubtful=x$doubtvars,
reg.fun=glm, k=1, vif=7, draws=50, weights = "lri", family = binomial(logit))}
eba_results <- lapply(mget(indicators),ebaFun) #eba_results is the object in question
手动我知道如何访问每个元素,例如:
eba_results$spec1$bounds$type #look at str(eba_results) to see the different levels
因此“bounds”是具有相同列名的数据帧,用于spec1和spec2。我想收集“bounds”中的以下5列:
type,cdf.mu.normal,cdf.above.mu.normal,cdf.mu.generic,cdf.above.mu.generic
每个规范的一个数据帧。手动这很简单但很难看:
collectedManually <-list(
manual_spec1 = data.frame(
type=eba_results$spec1$bounds$type,
cdf.mu.normal=eba_results$spec1$bounds$cdf.mu.normal,
cdf.above.mu.normal=eba_results$spec1$bounds$cdf.above.mu.normal,
cdf.mu.generic=eba_results$spec1$bounds$cdf.mu.generic,
cdf.above.mu.generic=eba_results$spec1$bounds$cdf.above.mu.generic),
manual_spec2= data.frame(
type=eba_results$spec2$bounds$type,
cdf.mu.normal=eba_results$spec2$bounds$cdf.mu.normal,
cdf.above.mu.normal=eba_results$spec2$bounds$cdf.above.mu.normal,
cdf.mu.generic=eba_results$spec2$bounds$cdf.mu.generic,
cdf.above.mu.generic=eba_results$spec2$bounds$cdf.above.mu.generic))
但我有超过2个规格,我认为这应该可以通过更漂亮的方式使用lapply函数。任何帮助将不胜感激!
p.s。:hrbrmstr的答案适用的一般例子,但结果过于简单:
exampleList = list(a=list(aa=data.frame(A=rnorm(10),B=rnorm(10)),bb=data.frame(A=rnorm(10),B=rnorm(10))),
b=list(aa=data.frame(A=rnorm(10),B=rnorm(10)),bb=data.frame(A=rnorm(10),B=rnorm(10))))
我希望有一个对象,例如,将所有A和B向量收集到两个数据帧(每个都有各自的A和B)中,然后是数据帧列表。手动这看起来像:
dfa <- data.frame(A=exampleList$a$aa$A,B=exampleList$a$aa$B)
dfb <- data.frame(A=exampleList$a$aa$A,B=exampleList$a$aa$B)
collectedResults <- list(a=dfa, b=dfb)
答案 0 :(得分:2)
这可能是一种不那么蛮力的方式。
如果您想要单个列的列表,这是一种方式:
get_col <- function(my_list, col_name) {
unlist(lapply(my_list, function(x) {
lapply(x, function(y) { y[, col_name] })
}), recursive=FALSE)
}
get_col(exampleList, "A")
get_col(exampleList, "B")
如果您想要一个统一的指标列数据框,这是一种方式:
collect_indicators <- function(my_list, indicators) {
lapply(my_list, function(x) {
do.call(rbind, c(lapply(x, function(y) { y[, indicators] }), make.row.names=FALSE))
})[[1]]
}
collect_indicators(exampleList, c("A", "B"))
如果您只想将各个data.frames提升到一个级别,以便更容易迭代写入文件:
unlist(exampleList, recursive=FALSE)
关于真正的输出格式的许多假设正在进行(问题有点模糊)。
答案 1 :(得分:0)
有一种蛮力方式可行,但依赖于几个命名对象:
collectEBA <- function(x){
df <- paste0("eba_results$",x,"$bounds")
df <- eval(parse(text=df))[,c("type",
"cdf.mu.normal","cdf.above.mu.normal",
"cdf.mu.generic","cdf.above.mu.generic")]
df[is.na(df)] <- "NA"
df
}
eba_export <- lapply(indicators,collectEBA)
names(eba_export) <- indicators