【问题标题】:How to counter the 'non-numeric matrix extent' error in R?如何应对 R 中的“非数字矩阵范围”错误?
【发布时间】:2016-12-11 17:15:01
【问题描述】:

我正在尝试使用标准随机方程从学生的 t 分布中生成模拟值的数据框。我使用的函数如下:

matgen<-function(means,chi,covariancematrix)
{
 cols<-ncol(means);
 normals<-mvrnorm(n=500,mu=means,Sigma = covariancematrix);
 invgammas<-rigamma(n=500,alpha=chi/2,beta=chi/2);
 gen<-as.data.frame(matrix(data=NA,ncol=cols,nrow=500));
 i<-1;
 while(i<=500)
 {
   gen[i,]<-t(means)+normals[i,]*sqrt(invgammas[i]);
   i<=i+1;
 }
return(gen);
}

如果不清楚,我正在尝试创建一个空数据框,它采用 cols 列数和 500 行中的值。当然,这些值是数字,R 告诉我在第 9 行:

gen<-as.data.frame(matrix(data=NA,ncol=cols,nrow=500));

有一个错误:“非数字矩阵范围”。

我记得以前用as.data.frame()把矩阵转成数据框,效果还挺流畅的。即使有数字。不过,我已经有一段时间没有联系了,似乎无法回忆或在网上找到解决此问题的方法。我在那里尝试了is.numeric(), as.numeric(), 0s 而不是 NA,但没有任何效果。

【问题讨论】:

  • 我认为问题在于cols 不是数字。但是,您没有显示如何调用该函数,尤其是传递给means 的内容。 PS:当你可以使用for 循环时使用while 循环只是效率低下。但我认为你根本不需要循环。
  • @Roland 感谢您的帮助!我使用covariancematrix 来获取该维度,现在它可以工作了!只是为了帮助我学习,你能解释一下为什么你认为我根本不需要循环吗?

标签: r matrix dataframe


【解决方案1】:

正如 Roland 指出的那样,一个问题是 col 似乎不是数字。请检查手段是数据框还是矩阵,例如str(意味着)。如果是,您的代码不应导致错误:'non-numeric matrix extent'。

您的代码中还有一些其他问题。我创建了一个简化的示例,并指出了我在代码中作为 cmets 发现的错误:

library(MASS)
library(LearnBayes)

means <- cbind(c(1,2,3),c(4,5,6))
chi <- 10

matgen<-function(means,chi,covariancematrix)
{
  cols <- ncol(means) # if means is a dataframe or matrix, this should work

  normals <- rnorm(n=20,mean=100,sd=10) # changed example for simplification
  # normals<-mvrnorm(n=20,mu=means,Sigma = covariancematrix) 
  # input to mu of mvrnorm should be a vector, see ?mvrnorm; but this means that ncol(means) is always 1 !?

  invgammas<-rigamma(n=20,a=chi/2,b=chi/2) # changed alpha= to a and beta= to b

  gen<-as.data.frame(matrix(data=NA,ncol=cols,nrow=20))

  i<-1
  while(i<=20)
  {
    gen[i,]<-t(means)+normals[i]*sqrt(invgammas[i]) # changed normals[i,] to normals [i], because it is a vector
    i<-i+1 # changed <= to <- 
  }
  return(gen)
}

matgen(means,chi,covariancematrix)

我希望这会有所帮助。 附:你不需要“;”在R中每一行的末尾

【讨论】:

  • 感谢所有帮助!特别是对于您放入的所有附加位!如果我自己克服了这个错误,i&lt;= 的错误会让我感到很愚蠢。幸运的是,它现在只对数百万互联网用户开放。 (:D) 我使用的是mvrnorm(),所以normals 是原始代码中的一个矩阵。我使用covariancematrix 来获取列数,因为它是一个数据框,现在代码可以工作了。
猜你喜欢
  • 2015-10-09
  • 2019-07-18
  • 2020-07-16
  • 2013-01-25
  • 2021-12-08
  • 1970-01-01
  • 2016-11-25
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多