我在一个数据帧中有大约11,000,000行,我需要遍历每行,进行少量计算,然后使用pchisq()从卡方分布中检索相应的p值。每次检索到该值时,它都会附加到一个空向量中,然后再添加到数据帧中。
这段代码效率很低,并且在服务器上运行需要整整一周的时间,我相信这是由于append()函数每次必须复制整个向量。我怎样才能使它尽可能有效?
这是当前循环:
std_err <- NULL
for (i in 1:nrow(father)){
std_err <- append(std_err, pchisq((mother[i,7]-father[i,7])^2/((mother[i,8])^2 + (father[i,8])^2), df=1, lower.tail = F))
}
father[ ,"p_std_err"] <- std_err
write.table(father, "father+standard_error.sumstats", sep = '\t', col.names = T, row.names = F, quote = F)
答案 0 :(得分:5)
pchisq()
是矢量化的,因此根本不需要循环。您可以只写:
pchisq((mother[, 7] - father[, 7])^2 / (mother[, 8]^2 + father[, 8]^2), df = 1, lower.tail = FALSE)