将列表列表作为数据帧返回

时间:2016-08-21 05:45:03

标签: r

在此处记录内部lapply电话的结果的正确方法是什么?我的最终目标是每个测试值都包含percentage_accuracystatparamcutoff的数据框。是否有更“R”的方式来做到这一点?

best<-lapply(1:100,function(i){
  statval<-sample.int(c(1,0),100,replace=T)
  lapply(1:100,function(j){
    aaa<-statval+j*27 
    list(percentage_accuracy=aaa,statparam=i,cutoff=j)
  })
})

2 个答案:

答案 0 :(得分:3)

我们可以将最里面的内容转换为data.framerbind,然后在最外层的循环中执行rbind

 d1 <- do.call(rbind, lapply(best, function(x) do.call(rbind, lapply(x, data.frame) )))
 str(d1)
 #'data.frame':   1000000 obs. of  3 variables:
 #$ percentage_accuracy: num  28 28 28 28 28 28 28 28 28 28 ...
 #$ statparam          : int  1 1 1 1 1 1 1 1 1 1 ...
 #$ cutoff             : int  1 1 1 1 1 1 1 1 1 1 ...

如果需要更快,请使用rbindlist

library(data.table)
d2 <- rbindlist(lapply(best, function(x) rbindlist(lapply(x, data.frame))))

答案 1 :(得分:3)

首先,您未正确使用sample.int()。第一个参数被视为标量,表示要采样的项目数。这意味着您的呼叫总是从一个项目中取样,即1,并且没有随机性。这与sample()的行为不同。例如:

sample.int(c(1,0),10L,T);
## [1] 1 1 1 1 1 1 1 1 1 1
sample(c(1,0),10L,T);
## [1] 1 0 1 0 0 0 0 0 1 1

鉴于您需要从0:1提取样本,您应该致电sample()

从您的代码中,我们可以一次性预先计算statparamcutoff列,而无需运行任何循环(隐藏或其他)。我们还可以一次预先计算statval向量,之后唯一剩下的任务是执行乘法和加法以完成percentage_accuracy列。棘手的一点是使复制正确,因为我们需要以特定方式排列列,并且我们需要重复statval向量的每个100元素片段正确的次数,因为您的代码重用它在内循环中。

我将如何做到这一点:

set.seed(1L);
NI <- 100L;
NS <- 100L;
NJ <- 100L;
res <- data.frame(
    percentage_accuracy=c(replicate(NI,rep(sample(0:1,NS,T),NJ))),
    statparam=rep(seq_len(NI),each=NS*NJ),
    cutoff=rep(seq_len(NJ),NI,each=NS)
);
res$percentage_accuracy <- res$percentage_accuracy+res$cutoff*27L;
str(res);
## 'data.frame': 1000000 obs. of  3 variables:
##  $ percentage_accuracy: int  27 27 28 28 27 28 28 28 28 27 ...
##  $ statparam          : int  1 1 1 1 1 1 1 1 1 1 ...
##  $ cutoff             : int  1 1 1 1 1 1 1 1 1 1 ...