【发布时间】:2017-05-09 20:54:54
【问题描述】:
我在这个帖子上有一个类似的问题: Using R, replace all values in a matrix <0.1 with 0?
但在我的情况下,我假设有更大的数据集和可变阈值。 我需要创建一个数据框,其中使用同一数据框第一列上的值从条件中检索到每个值。每一行的这些值都不同。
这是数据框的示例:
SNP A1 A2 MAF
rs3094315 G A 0.172
rs7419119 G T 0.240
rs13302957 G A 0.081
rs6696609 T C 0.393
这是我的代码示例:
seqIndividuals = seq(1:201)
for(i in seqIndividuals) {
alFrequ[paste("IND",i,"a",sep="")] = ifelse(runif(length(alFrequ$SNP),0.00,1.00) < alFrequ$MAF, alFrequ$A1, alFrequ$A2)
alFrequ[paste("IND",i,"b",sep="")] = ifelse(runif(length(alFrequ$SNP),0.00,1.00) < alFrequ$MAF, alFrequ$A1, alFrequ$A2)
}
我正在为“seqIndividuals”中的每个“i”创建两个新列,如果随机值低于“MAF”列,则从“A1”列检索任一值,如果高于“MAF”列,则检索“A2”。代码运行良好,但随着数据集按行和列(个人)增长,时间也显着增长。
有没有办法避免在这种情况下使用 IFELSE,因为我知道它作为一个循环工作?我尝试生成一个随机值矩阵然后替换它们,但它需要相同的时间甚至更长的时间。
mtxAlFrequ = matrix(runif(length(alFrequ$SNP)*(201)),nrow=length(alFrequ$SNP),ncol=201)
mtxAlFrequ[mtxAlFrequ < alFrequ$MAF] = alFrequ$A1
谢谢!
【问题讨论】:
-
这两个
ifelse语句似乎在做同样的事情,除了runif部分。如果是这种情况,您可以使用replicate(2, runif(... -
嗨@akrun。他们也在做同样的事情,只是创建一个具有不同名称的列,但我可以在之后更改名称。这会显着提高速度吗?谢谢
-
试试
lst <- do.call(c, lapply(seqIndividuals, function(i) replicate(2, alFrequ[2:3][cbind(1:nrow(alFrequ), (runif(nrow(alFrequ), 0, 1) >= alFrequ$MAF)+1)], simplify=FALSE))); nm1 <- paste0("IND", rep(letters[1:2], length(seqIndividuals)), rep(seqIndividuals, each = 2)); alFrequ[nm1] <- lst -
请试试上面的代码,看看是否提高了速度
-
Akrun,它确实更快,但并不多:510 秒与 340.000 行的 535 秒。我不希望使用超过 340K 的行,所以变化不是很显着。
标签: r for-loop matrix random dataframe