![](/img/trans.png)
[英]R: Splitting up a “:” delimited VCF file, using a 'for-loop' (iterating over several columns) to create multiple matrices
[英]R loop over multiple matrices
我有472個矩陣,每個矩陣有405列(matrix1,...,matrix400),並且想擁有472個新矩陣,而該矩陣只有前244列。 我怎樣才能做到這一點? 我試過了:
for (i in 1:472) {
assign(paste("new_matrix",i,sep=""), matrix[[i]][,c(1:244)])
}
我通過用一個標識符(對於組)將一個數據幀拆分來創建矩陣:
for (i in 1:472){
assign(paste("matrix", i, sep=""), subset(data, ID==i))
}
不知何故,我無法對每個矩陣說話,但是我不知道如何做到這一點。
您顯然應該采用其他方法。 分配所有單個矩陣不是一個好方法。 但是這是您可以做到的一種方法...
mat1 <- matrix(1:6, 2, 3)
mat2 <- matrix(2:7, 2, 3)
example_func <- function(mati) {
mat_name <- as.name(paste0("mat", mati))
bquote(.(mat_name) <- .(mat_name)[ , 1:2])
}
for (i in 1:2) eval(example_func(i))
但是,使用eval
可能會很復雜,因為您必須非常注意環境,尤其是在函數內部使用時。 作為示例,請嘗試運行lapply(1:2, function(x) eval(example_func(x)))
而不是使用for循環,並查看結果之間的差異。
?split
。 some_data <- data.frame(ID = rep(1:4, each = 4),
V1 = 1:16,
v2 = letters[1:16])
split(some_data, list(some_data$ID))
然后,您可以使用lapply
遍歷子集並進一步迭代子集。 或者,更好的是,僅將原始data.frame子集化為所需的列,然后使用split
。
matrix1 <- matrix(1:25, 5,5)
matrix2 <- matrix(26:50, 5,5)
假設我想對上述矩陣的前3列進行子集化,
list2env(
setNames(
lapply(mget(ls(pattern="matrix")), `[`, ,1:3),
paste("new", ls(pattern="matrix"),sep="_")),
envir=.GlobalEnv)
new_matrix1
# [,1] [,2] [,3]
#[1,] 1 6 11
#[2,] 2 7 12
#[3,] 3 8 13
#[4,] 4 9 14
#[5,] 5 10 15
new_matrix2
# [,1] [,2] [,3]
# [1,] 26 31 36
# [2,] 27 32 37
# [3,] 28 33 38
# [4,] 29 34 39
# [5,] 30 35 40
ls(pattern="matrix")
將輸出[1] "matrix1" "matrix2"
mget
獲取以列表形式存儲在上述矩陣中的值 lapply(...,
[ ,1:3)
[ ,1:3)
setNames
從matrix1
, matrix2
更改列表元素的名稱並paste
list2env
創建新對象new_matrix1
, new_matrix2
。 但是,在您的情況下,這將在全局環境中創建472個new_matrices
。 我希望將列表中的矩陣子集化,以執行列表中的所有必要計算。 然后,您可以使用來自library(MASS)
write.table
或write.matrix
將列表元素寫入文件。 如果從數據框開始
這是如何以矩陣列表結尾的,該列表按組(並具有名稱)和所需的行數進行划分:
library("ddply")
dlply(iris, .(Species), function(x) x[1:10,])
iris是您使用R為底的虛擬數據框; 物種是您的因素組
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.