2016-08-21 17 views
2

记录内部lapply调用的结果的正确方法是什么?我的最终目标是针对每个测试值,为percentage_accuracy,statparamcutoff的数据框。有更多的“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) 
    }) 
}) 

回答

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)))) 
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列。棘手的问题在于复制是否正确,因为我们需要列以特定的方式排列,并且我们需要重复每个100个元素的statval向量正确的次数,因为您的代码在内部重用它循环。

这是我会怎么做:

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 ...