我在研究中遇到的反复分析范例是需要根据所有不同的组id值进行子集,依次对每个组进行统计分析,并将结果放在输出矩阵中以便进一步处理/总结.
我通常在R中执行此操作的方式如下:
data.mat <- read.csv("...")
groupids <- unique(data.mat$ID) #Assume there are then 100 unique groups
results <- matrix(rep("NA",300),ncol=3,nrow=100)
for(i in 1:100) {
tempmat <- subset(data.mat,ID==groupids[i])
# Run various stats on tempmat (correlations, regressions, etc), checking to
# make sure this specific group doesn't have NAs in the variables I'm using
# and assign results to x, y, and z, for example.
results[i,1] <- x
results[i,2] <- y
results[i,3] <- z
}
Run Code Online (Sandbox Code Playgroud)
这最终为我工作,但根据数据的大小和我正在使用的组的数量,这可能需要长达三天.
除了分支到并行处理之外,还有什么"技巧"可以让这样的东西运行得更快吗?例如,将循环转换为其他东西(类似于使用包含我想在循环中运行的统计数据的函数的应用),或者不需要实际将数据子集分配给变量?
也许这只是常识(或抽样错误),但我尝试在我的一些代码中使用括号进行子集化而不是使用子命令,它似乎提供了一些让我感到惊讶的性能提升.我使用了一些代码并使用与上面相同的对象名称输出如下:
system.time(for(i in 1:1000){data.mat[data.mat$ID==groupids[i],]})
Run Code Online (Sandbox Code Playgroud)
Run Code Online (Sandbox Code Playgroud)user system …
希望这有一个简单的答案,我一直无法找到:
我试图写一个仿真,将比较了一些关于大矩阵的行(科目)不同子集和列(变量)的统计方法.
行的子集是使用相当简单sample()的主题ID号,但我正在与列多一点麻烦.
从本质上讲,我希望能够做的就是创建一个将被用来创建一个新的矩阵列索引号的随机样本.到目前为止,我最接近的是:
testmat <- matrix(rnorm(10000),nrow=1000,ncol=100)
column.ind <- sample(3:100,20)
teststr <- paste("testmat[,",column.ind,"]",sep="",collapse=",")
Run Code Online (Sandbox Code Playgroud)
这给了我一个字符串,其中包含testmat[,column.ind]每个采样索引号.有没有办法轻松将其插入cbind()函数中以制作新矩阵?我还有其他明显缺失的方法吗?
我已经能够使用一个循环(即做cbind(matrix,newcolumn)一遍又一遍),但是这是相当缓慢的,因为我使用的基质是相当大的,我会做很多次.我希望有一个更优雅,更快捷的联线解决方案.