我的代碼如下所示,我想知道是否有更好的方法讓它更快:
pos=NULL
row=data.frame(matrix(nrow=216,ncol=4))
colnames(row)=c("sub","subi","group","trial")
for (i in 1:100000){
row$sub="Positive"
row$subi=NA
row$group=NA
row$subi[1:144]=c(1:144)
row$group[1:144]=1
row$subi[145:216]=c(1:72)
row$group[145:216]=2
row$trial=i
pos=rbind(pos,row)
}
uj5u.com熱心網友回復:
不需要回圈。您可以自己構建一個data.frame或tibble(我的示例)。
鑒于您想稍后調整行長:
library(dplyr)
n_rows <- 10000
tibble(
trail = 1:n_rows,
sub = "positive",
subi = c(seq(1:144), seq(1:72), rep(NA, n_rows-216)),
group = c(rep(1, 144), rep(2, 72), rep(NA, n_rows-216))
)
輸出是:
# A tibble: 10,000 × 4
trail sub subi group
<int> <chr> <int> <dbl>
1 1 positive 1 1
2 2 positive 2 1
3 3 positive 3 1
4 4 positive 4 1
5 5 positive 5 1
6 6 positive 6 1
7 7 positive 7 1
8 8 positive 8 1
9 9 positive 9 1
10 10 positive 10 1
# … with 9,990 more rows
uj5u.com熱心網友回復:
看起來您正在嘗試復制此資料幀 100,000 次,并且幀的每次迭代都有不同的trial數字。
data.frame(sub = rep("Positive", 216),
subi = c(1:144, 1:72),
group = rep(c(1, 2), c(144, 72)))
該replicate功能非常適合多次運行靜態代碼。因此,一種選擇是創建 100,000 個副本,然后更新試用號。
FrameList <-
replicate(n = 100,
{
data.frame(sub = rep("Positive", 216),
subi = c(1:144, 1:72),
group = rep(c(1, 2), c(144, 72)),
trial = rep(NA_real_, 216))
},
simplify = FALSE)
要更新試用號,您可以使用for回圈
for (i in seq_along(FrameList)){
FrameList$trial <- i
}
或者你可以嘗試一些花哨的東西,但需要更多的代碼
FrameList <- mapply(function(FL, i){
FL$trial <- i
FL
},
FrameList,
seq_along(FrameList),
SIMPLIFY = FALSE)
無論你走哪條路,你都可以把它們堆在一起
Frame <- do.call("rbind", FrameList)
這當然不是最優雅的方法,所以請注意其他人會給你其他聰明的技巧。但是,我猜想,這將是要遵循的基本程序。
uj5u.com熱心網友回復:
回圈的每一次傳遞中唯一不同的是trial. rep是你的朋友。對于其他列,R 將自動回收以匹配最長的列(此處為trial21.6M 行)。
pos <- data.frame(
sub = "Positive",
subi = c(1:144, 1:72),
group = rep.int(1:2, c(144, 72)),
trial = rep(1:1e5, each = 216)
)
轉載請註明出處,本文鏈接:https://www.uj5u.com/yidong/473790.html
下一篇:如何將列中的值除以R中的條件?
