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
函数中执行此操作?
希望这是有道理的。
答案 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()
或by
或tapply
或......不合适;每个假设只有一个参数是变化的。相反,请使用sapply
或类似的mapply
Map