1
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()

按此(现在是一个因素)列对数据框进行排序可以正常工作。我的问题是,对于情节标题,我想用该列中的正确索引对其进行标记。这在 for 循环中很容易做到uniq[i]。如何在by函数中执行此操作?

希望这是有道理的。

4

1 回答 1

2

更矢量化(== 更酷?)的版本会将常见操作拉出循环,并让 R 对唯一因子水平进行簿记。

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

paste0对于通常paste与参数一起使用的常见用例来说是一种便利功能sep="")。for当您运行它的副作用(绘制漂亮的图片)而不是尝试捕获值以进行进一步计算时,该循环是完全合适的;T用它代替 TRUE绝对不酷,同时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()

如果您确实想捕获值,则基本观察是您的函数采用 2 个不同的参数。所以byor tapplyor or sapplyor ... 不合适;这些中的每一个都假设只有一个参数是变化的。相反,使用mapply或类似的Map

Map(qq.chisq, dat, main=names(dat),
    MoreArgs=list(df=2, pvals=TRUE, sub=subtitle))
于 2013-09-11T14:05:53.430 回答