2015-11-03 21 views
0

我使用ExtremeBounds包,其提供作为结果与多级列表(其中包括)在最低层dataframes深处列表。我在几个规格运行此包,我想收集选定dataframes的一些列在了这些结果。这些应该由规范(SPEC1和SPEC2在下面的示例)被收集并布置在dataframes的列表。 dataframes的这个列表然后可以用于所有类型的东西,例如不同规格的结果导出到不同的Excel表。R:ADRESS对象与内部功能/环(ExtremeBounds封装)过滤命令

下面是一些代码,创建有问题的对象(只需运行该代码盲目的,我的问题只涉及如何处理那种它创建列表: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 

因此,“边界”是具有两个SPEC1和SPEC2相同列名的数据帧。我想从 “边界” 收集以下5列:

类型,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功能于一身漂亮的方式。任何帮助,将不胜感激!

PS:一个普通的例子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和乙载体引入两个数据帧(每个具有其各自的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

什么是你想要的输出了这一切? –

+0

数据帧列表 –

回答

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

如果你想指示灯列的综合data.frame这是一种方式:

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

如果你只是想使单个数据框架达到一定水平,以便更容易迭代写入文件:

unlist(exampleList, recursive=FALSE) 

关于真正输出格式的许多假设正在做出(这个问题有点含糊)。

+0

你能解释一下嵌套乐器吗?我在那里输了一些......我更新了问题 –

+1

第一个遍历列表中的第一个级别,并将每个子列表传递给下一个lappy迭代器。该迭代器在单个2级子列表上工作。默认情况下它会返回一个嵌套的列表结构(每个'lapply'返回一个列表),所以我们不得不仅仅从最顶层去解释这个结构。 – hrbrmstr

+0

所以如果我有更多级别的列表,我需要更多级别的lapply?也许是 –