我正在根據來自不同表的值填充二進制矩陣。我可以創建矩陣,但正在努力填充它所需的回圈。我認為這是一個非常簡單的問題,所以我希望我能得到一些簡單的幫助。
這是我的資料示例:
start <- c(291, 291, 291, 702, 630, 768)
sequence <- c("chr9:103869456:103870456", "chr5:30823103:30824103", "chr11:49801703:49802703", "chr4:133865601:133866601", "chr12:55738034:55739034", "chr8:96569493:96570493")
motif <- c("ARI5B", "ARI5B", "ARI5B", "ATOH1", "EGR1", "EGR1")
df <- data.frame(start, sequence, motif)
我為每個獨特的主題 起始值創建了一個字符向量,如下所示:
x <- sprintf("%s_%d", df$motif, df$start)
x <- unique(x)
接下來,我創建一個二進制矩陣,其中序列作為行,x 中的值作為列:
binmat <- matrix(0, nrow = length(df$sequence), ncol = length(x))
rownames(binmat) <- df$sequence
colnames(binmat) <- x
現在我被困住了。我想遍歷列和行,并在每個匹配的位置放置一個 1。例如,第一個序列是“chr9:103869456:103870456”,它在起始位置 291 處具有主題“ARI5B”,因此它應該得到 1,而該行中的其余值保持為 0。此示例的輸出應該是這樣的:
ARI5B_291 ATOH1_702 EGR1_630 EGR1_768
chr9:103869456:103870456 1 0 0 0
chr5:30823103:30824103 1 0 0 0
chr11:49801703:49802703 1 0 0 0
chr4:133865601:133866601 0 1 0 0
chr12:55738034:55739034 0 0 1 0
chr8:96569493:96570493 0 0 0 1
但到目前為止,我還沒有成功。我想我需要一個雙回圈沿著這些線:
for (row in binmat){
for (col in binmat){
if (row && col %in% x){
1
} else { 0
}
}
}
但我得到的都是0。
提前致謝!
uj5u.com熱心網友回復:
你不就是找table
這里嗎?通過執行以下操作,您可以將結果作為矢量化單線,沒有回圈:
table(factor(df$sequence, df$sequence), sprintf("%s_%d", df$motif, df$start))
ARI5B_291 ATOH1_702 EGR1_630 EGR1_768
chr9:103869456:103870456 1 0 0 0
chr5:30823103:30824103 1 0 0 0
chr11:49801703:49802703 1 0 0 0
chr4:133865601:133866601 0 1 0 0
chr12:55738034:55739034 0 0 1 0
chr8:96569493:96570493 0 0 0 1
轉載請註明出處,本文鏈接:https://www.uj5u.com/ruanti/505274.html
上一篇:在R中命名N個子串列
下一篇:密碼生成器代碼回傳空輸出