【问题标题】:create a matrix and row/col names in loop, in R在 R 中循环创建矩阵和行/列名称
【发布时间】:2021-10-30 06:40:26
【问题描述】:

我想要一个 7*17 的矩阵。
行名从 2:8 开始(第一行名是 2,第二行是 3 和 ...)
colnames 是 4:17(第一列的名称为 4,第二列的名称为 5 和 ...)
矩阵元素被填充为 mat[i,j] = 第 i 行的行名 * 第 j 列的列名。

我的尝试出错了:

mat <- matrix(0, nrow = 7, ncol = 17 , byrow = TRUE)
for (rr in 2:8) {
  row.names(mat)[rr-1] <- paste('class', rr, sep='.')
  for(cc in 4:20){
    mat[rr-1,cc-3] <- rr*cc
    colnames(mat)[cc] <- paste('count', cc, sep='.')
      }
}

这是错误:

dimnames(x) 中的错误

我该如何解决这个问题。

【问题讨论】:

  • 应该使用矩阵,还是可以使用dataframe,其中一列包含名称?

标签: r loops matrix


【解决方案1】:

题中的代码有几个问题:

  1. 它正在尝试将名称插入名称向量,但尚未在矩阵上设置名称。
  2. colnames(mat)[cc]&lt;-... 应该是 colnames(mat)[cc-3]&lt;-
  3. 使用byrow=TRUE 不是错误,但毫无意义,因为每个元素都是 0,因此插入 0 的顺序无关紧要。

1) 建议改为:

rr <- 2:8
cc <- 4:20
mat <- outer(rr, cc)
dimnames(mat) <- list(paste0("class.", rr), paste0("count.", cc))

2) 或者,这可以通过使用 listcompr 包的列表推导来完成。对于 rr 中的每个 r 值,gen.named.vector 调用创建一个命名向量,形成一行,然后 gen.named.matrix 从这些行创建一个矩阵。

library(listcompr)
gen.named.matrix("class.{r}", gen.named.vector("count.{c}", c*r, c = cc), r = rr)

3)如果您想修复问题中的代码,请这样做:

mat <- matrix(0, nrow = 7, ncol = 17 ,
  dimnames = list(character(7), character(17)))
for (rr in 2:8) {
  rownames(mat)[rr-1] <- paste('class', rr, sep='.')
  for(cc in 4:20) {
    mat[rr-1, cc-3] <- rr * cc
    colnames(mat)[cc-3] <- paste('count', cc, sep='.')
  }
}

【讨论】:

  • 这很棒。只是,我想要“class.2”,“class.3”,...的模式用于行名,“count.4”,“count.5”,...用于列名。不仅仅是数字。
  • 查看修改后的答案。
  • 谢谢。好吧,我必须从我提出问题的循环中创建我的矩阵。我只是想知道为什么 $dimnames(mat)
  • dimnames 的参数应该是你的矩阵。先创建矩阵,然后分配名称。
猜你喜欢
  • 2014-09-03
  • 1970-01-01
  • 2017-10-25
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2014-04-05
  • 1970-01-01
  • 2020-07-14
相关资源
最近更新 更多