我有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))
}
不知怎的,我无法对每个矩阵说话,但我不知道如何做到这一点。
答案 0 :(得分:3)
你显然应采取不同的方法。分配所有个人 matricies NOT 是一种很好的方法。但这是你可以做到的一种方式......
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-loop并查看结果的不同。
?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
。
答案 1 :(得分:1)
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)
matrix1
和matrix2
setNames
,paste
列表元素的名称
list2env
创建新对象new_matrix1
,new_matrix2
。但是,在您的情况下,这将在全局环境中创建472 new_matrices
。我更愿意在列表中对矩阵进行子集化,在列表中进行所有必要的计算。然后,您可以使用write.table
中的write.matrix
或library(MASS)
将列表元素写入文件。答案 2 :(得分:0)
如果您从数据框开始
以下是如何以群组分割的矩阵列表(以及其名称)和您想要的行数结束:
library("ddply")
dlply(iris, .(Species), function(x) x[1:10,])
iris是一个基数为R的虚拟数据帧; 物种是你的因素组