R迭代矩阵

时间:2018-02-27 20:41:31

标签: r matrix

如何有效地迭代矩阵?我必须能够获得行和列名称。

我当前的代码(可行):

m <- matrix(1:9,3,3,FALSE,dimnames = list(c("x1","x2","x3"),c("y1","y2","y3")))

for(row in 1:nrow(m)) {
  for(col in 1:ncol(m)) {
    print(paste(
        dimnames(m)[[1]][row], dimnames(m)[[2]][col],", value:", m[row,col],sep=" "
    ))
  }
}

2 个答案:

答案 0 :(得分:3)

您可以在这里使用mapply

mapply(function(v, r, c) {paste(v, r, c)}, 
   m, rownames(m)[row(m)], colnames(m)[col(m)])

但是,这个好主意是否真的取决于你认为你需要明确地迭代矩阵中的值的原因。有许多函数可以工作而无需显式编写循环。

答案 1 :(得分:2)

完全向量化的选项是使索引包含outer,然后使用paste,并将结果分配回矩阵结构:

m <- matrix(1:9, 3, 3, FALSE, dimnames = list(c("x1","x2","x3"), c("y1","y2","y3")))

m2 <- m    # don't overwrite m
m2[] <- paste(outer(rownames(m), colnames(m), paste), 'value:', m)

m2
#>    y1               y2               y3              
#> x1 "x1 y1 value: 1" "x1 y2 value: 4" "x1 y3 value: 7"
#> x2 "x2 y1 value: 2" "x2 y2 value: 5" "x2 y3 value: 8"
#> x3 "x3 y1 value: 3" "x3 y2 value: 6" "x3 y3 value: 9"

如果您愿意,可以使用结果重新构建新矩阵,而不是覆盖现有矩阵,从nrow拉出ncoldimnamesm

m2 <- matrix(paste(outer(rownames(m), colnames(m), paste), 'value:', m), 
             nrow(m), ncol(m), dimnames = dimnames(m))

结果完全相同。