如何将此for循环转换为R中更酷的东西

时间:2013-09-11 12:50:55

标签: r

uniq <- unique(file[,12])
pdf("SKAT.pdf")
for(i in 1:length(uniq)) {
    dat <- subset(file, file[,12] == uniq[i])
    names <- paste("Sample_filtered_on_", uniq[i], sep="")
    qq.chisq(-2*log(as.numeric(dat[,10])), df = 2, main = names, pvals = T,
        sub=subtitle)
}
dev.off()

file[,12]是一个整数,所以当我尝试使用by而不是for循环运行它时,我将其转换为一个因子,如下所示:

pdf("SKAT.pdf")
by(file, as.factor(file[,12]), function(x) { qq.chisq(-2*log(as.numeric(x[,10])), df = 2, main = paste("Sample_filtered_on_", file[1,12], sep=""),  pvals = T, sub=subtitle) } ) 
dev.off()

通过此(现在是因子)列对数据框进行排序可以正常工作。我的问题是,对于情节标题,我想用该列中的正确索引标记它。这可以通过uniq[i]在for循环中轻松完成。如何在by函数中执行此操作?

希望这是有道理的。

1 个答案:

答案 0 :(得分:2)

更加向量化(==冷却?)版本会将常用操作拉出循环,让R对独特因子级别进行记录。

dat <- split(-2 * log(as.numeric(file[,10])), file[,12])
names(dat) <- paste0("IoOPanos_filtered_on_pc_", names(dat))

paste0是常见用例的便利函数,通常会使用带有参数paste的{​​{1}}。 sep=""循环完全适用于您为其副作用运行它(绘制精美图片)而不是尝试捕获值以进行进一步计算;使用for代替TRUE肯定不太酷,而T意味着您的代码在seq_along(dat)时不会产生意外结果。

length(dat) == 0

如果您确实想要捕获值,那么基本观察是您的函数需要两个不同的参数。因此pdf("SKAT.pdf") for(i in seq_along(dat)) { vals <- dat[[i]] nm <- names(dat)[[i]] qq.chisq(val, main = nm, df = 2, pvals = TRUE, sub=subtitle) } dev.off() bytapply或......不合适;每个假设只有一个参数是变化的。相反,请使用sapply或类似的mapply

Map