在此处记录内部lapply
电话的结果的正确方法是什么?我的最终目标是每个测试值都包含percentage_accuracy
,statparam
和cutoff
的数据框。是否有更“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)
})
})
答案 0 :(得分:3)
我们可以将最里面的内容转换为data.frame
,rbind
,然后在最外层的循环中执行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()
。
从您的代码中,我们可以一次性预先计算statparam
和cutoff
列,而无需运行任何循环(隐藏或其他)。我们还可以一次预先计算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 ...