除了我之前的问题R: How to match/join 2 matrices of different dimensions (nrow/ncol)?,我需要一个循环,因为我有一个超过1000个矩阵的列表。我决定使用代码(来自答案)
full_matrix[rownames(full_matrix) %in% rownames(small_matrix),
colnames(full_matrix) %in% colnames(small_matrix)] <- small_matrix
在我的情况下,单个矩阵匹配工作正常。但是,我在将此代码实现到list
matrices
“small_matrix”的循环中时遇到问题。这是我的代码:
full_matrix <- list()
for(i in 1:length(small_matrix))
{
full_matrix[i][rownames(full_matrix[i]) %in% rownames(small_matrix[i]),
colnames(full_matrix[i]) %in% colnames(small_matrix[i])] <- small_matrix[i]
}
我收到错误:incorrect number of subscripts on matrix
,这可能是由于我对循环的基本知识中的错误索引造成的。我感谢任何帮助。感谢
根据@Jim M的答案进行新编辑: 你的答案适用于这个例子,但是应该像在前一个question中一样在循环中创建small_matrix(ces)。在这里您可以找到代码示例:
library(abind)
a = c("A", "B", "C", "D", "E", "F")
full_matrix = array(dim=c(6,6,2))
dimnames(full_matrix) <- list(levels(as.factor(a)), levels(as.factor(a)),
c("mat1","mat2"))
正如@Jim M.建议的那样。这里有新代码:
##### new part for small matrix
df_import <- data.frame(OC = c("A", "A", "B", "B", "C", "C", "D", "D"),
TC = c("Z", "Z", "Y", "Y", "X", "X", "W", "W"),
Value = c(1,2,3,4,5,6,7,8),
Year = c(2010,2011))
Import_Year <- split(df_import, df_import$Year)
library(reshape2)
small_matrix <- list()
for(i in 1:length(unique(Import_Year)))
{
small_matrix[[length(small_matrix)+1]] <- dcast(OC ~ TC, data =Import_Year[[i]], value.var = "Value")
}
small_matrix
##### end new part
并且比@Jim的for循环更进一步。 L:
for(i in seq_along(small_matrix_list)){
afill(full_matrix[, , i], local= TRUE ) <- small_matrix[[i]]
}
但是,我收到以下错误消息:
Error in `afill<-.default`(`*tmp*`, local = TRUE, value = list(OC = 1:4, :
'x' must have names on dimensions corresponding to those in 'value'
有什么想法吗?感谢
答案 0 :(得分:1)
我会将你的完整“矩阵”创建为一个三维数组而不是一个列表,然后通过循环遍历数组三维维度的相应索引,用一个较小矩阵列表填充这个数组。
library(abind)
a = c("A", "B", "C", "D", "E", "F")
full_matrix = array(dim=c(6,6,2))
dimnames(full_matrix) <- list(levels(as.factor(a)), levels(as.factor(a)),
c("mat1","mat2"))
small_matrix_1 = matrix(c(2, 4, 3, 1, 5, 7, 3, 1, 6), nrow=3, ncol=3)
dimnames(small_matrix_1) <- list(c("B","C","E"), c("A","B","F"))
small_matrix_2 = matrix(c(20, 40, 30, 10, 50, 70, 30, 10, 60), nrow=3, ncol=3)
dimnames(small_matrix_2) <- list(c("B","C","E"), c("A","B","F"))
small_matrix_list <- list(small_matrix_1, small_matrix_2)
for(i in seq_along(small_matrix_list)){
afill(full_matrix[, , i], local= TRUE ) <- small_matrix_list[[i]]
}
给予 full_matrix 第三个索引对应于每个小矩阵。
, , mat1
A B C D E F
A NA NA NA NA NA NA
B 2 1 NA NA NA 3
C 4 5 NA NA NA 1
D NA NA NA NA NA NA
E 3 7 NA NA NA 6
F NA NA NA NA NA NA
, , mat2
A B C D E F
A NA NA NA NA NA NA
B 20 10 NA NA NA 30
C 40 50 NA NA NA 10
D NA NA NA NA NA NA
E 30 70 NA NA NA 60
F NA NA NA NA NA NA
修改:不像上一个问题那样使用dcast
创建data.frames,而是将数据转换为数组(acast
),以便将它们插入到更大的阵列。
library(reshape2)
small_matrix <- vector(mode = "list", length = 2) # Pre-allocate space in the list
for (i in seq(Import_Year)){
small_matrix[[i]] <- acast(OC ~ TC, data = Import_Year[[i]], value.var = "Value")
}
答案 1 :(得分:0)
我发现了几个问题:
[[
选择列表中的元素,例如small_matrix[[i]]
。full_matrix
初始化为空列表。因此full_matrix[i]
评估为list(NULL)
small_matrix
的所有行和列名都出现在full_matrix
中。如果他们这样做,您可以简化分配如下(*)。 (如果不能保证,您需要通过名称的交集对两边进行子集化。)full_matrix
正确初始化。您可能还有一个矩阵列表,或者一个常用的完整矩阵,您可以在其中替换不同的子块。(*)
full_matrix[rownames(small_matrix), colnames(small_matrix)] <- small_matrix