【问题标题】:no 'dimnames' attribute for array数组没有“dimnames”属性
【发布时间】:2021-09-15 16:57:57
【问题描述】:

我正在尝试运行以下 R 代码:

X <- matrix(0, n_countries, n_languages)
for (index in 2:n_edges)
{
  i <- edgelist[index, 1]
  j <- edgelist[index, 2]
  perc <- edgelist[index, 3]
  if (perc > 0 ) 
    X[i,j] = 1

}

edgelist 是我读入的 .csv 文件,前几行如下所示:

                   V1  V2    V3
1   % bip posweighted  NA    NA
2                  31  18 1.000
3                 221  28 0.018
4                 185  12 0.000
5                  38  87 0.031

R 说if 语句中有错误,

Error in `[<-`(`*tmp*`, i, j, value = 1) : 
no 'dimnames' attribute for array

我已尝试应用以下解决方案:

  1. 删除第一行,NA 值与

    edgelist &lt;- edgelist[-c(1),]

  2. 并将列名更改为整数

    colnames(edgelist) &lt;- c(1,2,3)

这些似乎都不起作用,因为我不断收到同样的错误。我真的不确定如何解决这个问题,因为我不明白为什么 for 循环不只是将行读入矩阵。任何建议将不胜感激。

【问题讨论】:

  • 那是因为你的边缘列表是模式字符而不是整数/数字。在这种情况下,例如edgelist[index, 1] 会给你"31" 而不是31。您可能需要显式转换为数字
  • 我申请了edgelist_num &lt;- as.numeric(unlist(edgelist)),但不幸的是,出现了同样的错误。
  • 您在转换为数字时是否收到了一些警告?检查下面的答案
  • 是的,迈克尔的回答很完美。

标签: r csv matrix


【解决方案1】:

删除第一行后,您需要将第一列从字符转换为数字。

edgelist[,1] <- as.numeric(edgelist[,1])

删除第一行后,请务必将 for() 循环更改为从 1:n_edges 运行而不是 2:n_edges

另一个更快的解决方案来自Matrix 包,它使用sparseMatrix() 函数来创建这样的矩阵。对于这个函数,你给它你的行索引、列索引和你想放在那里的值,它会为你创建矩阵。虽然要使用它,但您可能必须将其从 dgCMatrix 转换为常规的 matrix

install.packages("Matrix")
library(Matrix)
Y <-   sparseMatrix(
         i = edgelist[,1],
         j = edgelist[,2],
         x = 1*(edgelist[,3] > 0)
       )
Y <- as.matrix(Y)

【讨论】:

    猜你喜欢
    • 2019-01-10
    • 2013-04-21
    • 1970-01-01
    • 2021-08-08
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多