2014-09-19 38 views
0

我試圖做很多隨機抽樣試驗,並且在這些採樣中,我可能不會每次都得到一切。包括R中隨機採樣後的缺失值(合併向量幷包含缺失值爲0)

現在,我要做的就是

test <- sample(rownames(data), size=10000, replace=T, prob=data$refFraction) 

並不是每一個rowname(data)在此表示,但我需要它的下一個步驟。

我想這樣每次我都有我的sample我有相同的長度(和順序)向量,以便我可以將每個採樣組合成一個矩陣(我也不確定如何做最好的 - 我怎麼能使成千上萬的測試向量,並與的應用功能之一立刻將它們合併)

編輯:根據答案,我想出了這個:

trials <- function(fractions, kmers, times, ref_size) { 
    replicate(times, sample(kmers, size=ref_size, replace=T, prob=fractions), simplify=F) 
} 

result <- trials(data$refFraction, rownames(data), 100, 1000) 
mat <- matrix(result, nrow=100) 

但我還是隻想的計數在該行中看到每件事物的次數,同時也具有零計數,所以我最終得到一個偶數矩陣。

期望的結果是這樣的:

  "A" "B" "C" 
Trial1 2 5 6 
Trial2 3 7 12 
Trial3 0 5 14 

dput(頭(數據)):

structure(list(refCount = c(3142L, 4102L, 1975L, 2009L, 2363L, 
2437L), refFraction = c(0.00300290255094, 0.00392040301208, 0.00188756605287, 
0.00192006086086, 0.00225838915591, 0.00232911314979), readCount = c(147L, 
719L, 356L, 418L, 745L, 766L), readFraction = c(0.00029577107721, 
0.00144666261574, 0.000716289139367, 0.000841036124312, 0.00149897586749, 
0.00154122887852), foldChange = c(2.31774884958, 0.996935198459, 
0.968959564031, 0.825477549838, 0.409869676355, 0.412907501432 
), p_value = c(5.05923221341436e-321, 4.46023836252119e-170, 
2.29230878162415e-77, 1.73499617494115e-59, 2.80547347576314e-15, 
4.32620038741552e-16)), .Names = c("refCount", "refFraction", 
"readCount", "readFraction", "foldChange", "p_value"), row.names = c("AAAAA", 
"AAAAT", "AAAAG", "AAAAC", "AAATA", "AAATT"), class = "data.frame") 
+0

我有點困惑。你需要使用替換嗎?您是否想要創建多個測試樣本,但僅限於包含rownames(數據)每個成員的示例? – kungfujam 2014-09-19 21:15:51

+1

不清楚你在做什麼,但你可以使用'replicate'來重複抽樣。結果是矩陣。例如'replicate(2,sample(5))' – 2014-09-19 21:17:38

+0

@RichardScriven完成了,謝謝 – 2014-09-19 22:09:46

回答

1

這不完全清楚你正在嘗試做的,但似乎這樣的威力幫幫我。

replicate非常適合重複採樣。在這裏,我創建了一個5行數據框d,然後對行名稱進行十次不同的採樣。當以這種方式使用時,replicate產生矩陣,所以它聽起來像你可能想要這種方法。

> d <- data.frame(x = 1:5, y = 6:10) 
> replicate(10, sample(rownames(d))) 
#  [,1] [,2] [,3] [,4] [,5] [,6] [,7] [,8] [,9] [,10] 
# [1,] "5" "1" "1" "3" "4" "1" "4" "5" "3" "1" 
# [2,] "4" "5" "2" "2" "3" "5" "1" "2" "1" "2" 
# [3,] "1" "4" "5" "5" "5" "4" "3" "3" "2" "3" 
# [4,] "2" "3" "3" "1" "1" "2" "2" "4" "4" "5" 
# [5,] "3" "2" "4" "4" "2" "3" "5" "1" "5" "4" 
+0

作爲一個字符矩陣或數字矩陣的確是同樣的事情,因爲我想要統計我隨機抽樣每個行名稱的次數。基於你的評論,我寫了一個函數,我將編輯到OP中,但我仍然不確定如何從這個計數,仍然有一個大小均勻的矩陣。 – 2014-09-19 21:46:37

+1

好的,是的。如果您提供更多信息,最好是最好,而預期結果肯定會有很大幫助。 – 2014-09-19 21:48:03

0

這是我最後只是:

trial_fn <- function(counts) { 
    replicate(num_trials, sample(counts, size=trial_size, replace=F), simplify=F) 
} 

tableize <- function(x) { 
    tmp <- matrix(table(factor(x, levels=1:1024)))[,1] 
    tmp/sum(tmp) 
} 

counts <- vector() 
for (i in 1:1024) { 
    counts <- c(counts, rep(i, times=data[i,]$readCount)) 
} 

trials <- trial_fn(counts) 
trial_table <- sapply(trials, tableize) 

使用factorlevels,然後使用table的結果就是答案原來的問題。