2014-05-12 201 views
1

我有一個df有三列和幾行。我正在嘗試使用下面的循環創建一個列表,但是在我需要用多個結果填充列表的步驟中失敗。有人可以指我哪裏錯了嗎?嵌套循環不起作用

這裏是我的DF的子集

 Gene  kaks chr 
1 Bra011025 0.5909820 A01 
2 Bra011027 0.3684600 A01 
3 Bra011028 0.2126320 A01 
4 Bra011030 0.0910217 A01 
5 Bra011033 0.2412330 A01 
6 Bra011034 0.1092790 A01 

這裏是我的循環

results <- list() 
chro <- c("A01", "A02", "A03", "A04", "A05", "A06", "A07", "A08", "A09", "A10") 

for(i in 1:10) { 
    for(j in c("A01", "A02", "A03", "A04", "A05", "A06", "A07", "A08", "A09", "A10")) { 
     simulated.index <- sample(1:nrow(allData),sum(allData$chr==j)) 
     simulated.kaks <- allData$kaks[simulated.index] 
     simulatedNot.kaks <- allData$kaks[-simulated.index] 
     results[[j]] <- mean(simulated.kaks)-mean(simulatedNot.kaks) 
    } 
} 

輸出僅包含一個值..

> head(results) 
$A01 
[1] 0.003432181 

$A02 
[1] -0.03501376 

$A03 
[1] -0.0003581717 

$A04 
[1] -0.01792963 

$A05 
[1] -0.01241799 

$A06 
[1] 0.002551261 
+0

是''結果[J]] < - mean(simulated.kaks)-mean(simulated.kaks)''應該是''results [[j]] < - mean(simulated.kaks)-mean(simulatedNak.kaks)''? –

+0

我糾正了我的錯誤,我編輯了我的問題。你能幫我解決這個問題嗎? – upendra

+0

問題是什麼?看起來你對每個「j」值有不同的意義。這些結果不正確? – josliber

回答

1

您可以爲每個指標j做仿真,使用lapply功能(與超過一個chr值的例子......)

allData = read.table(text="  Gene  kaks chr 
1 Bra011025 0.5909820 A01 
2 Bra011027 0.3684600 A01 
3 Bra011028 0.2126320 A01 
4 Bra011030 0.0910217 A02 
5 Bra011033 0.2412330 A02 
6 Bra011034 0.1092790 A02", header=T) 
setNames(lapply(unique(allData$chr), function(j) { 
    sapply(1:10, function(i) { 
     simulated.index <- sample(1:nrow(allData),sum(allData$chr==j)) 
     simulated.kaks <- allData$kaks[simulated.index] 
     simulatedNot.kaks <- allData$kaks[-simulated.index] 
     mean(simulated.kaks)-mean(simulatedNot.kaks) 
    }) 
}), unique(allData$chr)) 
# $A01 
# [1] 0.15869543 -0.16243990 -0.08979343 0.15869543 -0.07762190 -0.07072610 
# [7] -0.05855457 -0.26258077 -0.15869543 -0.07072610 
# 
# $A02 
# [1] 0.15869543 -0.07762190 0.01034743 0.17461143 -0.24351343 0.24351343 
# [7] 0.24351343 -0.17461143 0.05855457 0.17461143 
+0

它工作得非常棒......使用'lapply'和'sapply'。謝謝.. @ josilber – upendra

0

我認爲你必須做兩個列表。

results_A <- list() 
results_B <- list() 
for(i in 1:5) { 
    for(j in 1:5) { 
    results_A[[j]] <- i*j 
    } 
    results_B[[i]] <- results_A 
} 

results_B 
+0

OP爲每個'j'值運行多個模擬,所以最好的輸出結構可能是一個列表(由'j'索引),其中包含模擬的平均差異向量。 「單值列表」很難處理。 – josliber