【问题标题】:Got an error 'non-numeric argument to mathematical function' from for-loop in R从 R 中的 for 循环中得到错误“数学函数的非数字参数”
【发布时间】:2023-03-13 03:08:01
【问题描述】:

我正在处理一些带有 for 循环的简单 R 代码。 我的代码的主要目标是使用 for 循环计算给定数据集(矩阵)的卡方值

我有 2 个尺寸为 5*15 的矩阵(B 和 d) 下图分别为矩阵B、矩阵d。

free<-matrix(NA,nrow=15,ncol=5)

for(i in 1:5){
for(j in 1:15){
    free[i,j]<-chisq(i,j)
   }
 }


chisq <-function(i,j){ 
pchisq(B[i,j],df=d[i,j],lower.tail=FALSE)
}

矩阵 B:

矩阵d:

最后,代码结果的错误是

Non-numeric argument to mathematical function.

您能帮我找出问题所在吗?

很高兴知道如何解决它。


在你的帮助下,我这样编辑了我的代码

B<-as.matrix(B)
d<-as.matrix(d)
free<-matrix(NA,nrow=15,ncol=5)

chisq <-function(i,j){
      pchisq(B[i,j],df=d[i,j],lower.tail=FALSE)
      }

for(i in 1:5){
        for(j in 1:15){
        free[i,j]<-chisq(i,j)
      }
    }

那么错误信息就是

Error in B[i, j] : subscript out of bounds

在评论之后发布 dput(d) 和 dput(B) 我有这个!

输入(d) 结构(c(12, 23, 18, 14, 12, 20, 12, 15, 17, 16, 24, 19, 14, 13, 16, 12, 22, 16, 13, 12, 17, 12, 13, 17, 13, 23, 17, 13, 13, 12, 11, 22, 15, 13, 12, 16, 12, 13, 15, 13, 23, 16, 11, 12, 11, 11, 22, 14, 13, 12, 16, 12, 12, 14, 11, 22, 14, 11, 12, 10, 11, 22, 14, 13, 11, 16, 10, 12, 14, 11, 21, 14, 10, 10, 10), .Dim = c(15L, 5L), .Dimnames = list(NULL, c("D1", "D2", "D3", "D4", "D5"))) 输出(B) 结构(c(63.4359、161.77、104.931、42.9404、18.3315、51.2222、 22.0478、72.04、89.8262、45.0258、137.835、74.5486、65661.7、 51.2519、57.2574、63.4359、135.564、96.5449、42.7049、18.3315、 47.9553、22.0478、65.6375、89.8262、26.9698、121.79、69.53、66.8152、 51.2519、52.6687、61.041、135.564、95.4561、42.7049、18.3315、 42.9336、22.0478、65.6375、88.567、26.9698、121.79、67.9544、 65.0612、49.9536、52.0815、61.041、135.564、95.138、42.7049、 18.3315、42.9336、22.0478、65.3476、88.567、22.2159、119.689、 41.1733、65.0612、49.9536、51.6908、61.041、135.564、95.138、 42.7049、16.0557、42.9336、20.369、65.3476、88.567、22.2159、 118.65, 41.1733, 59.8942, 39.9696, 51.6908), .Dim = c(15L, 5L ), .Dimnames = list(NULL, c("B1", "B2", "B3", "B4", "B5")))

【问题讨论】:

  • 欢迎来到 SO!确保您的矩阵实际上是数字的。检查数字是否由于某种导入原因不是字符类。
  • 感谢您的评论!但如您所见,矩阵 B 中的元素类别是双精度的,而 d 是整数。他们是错误的原因吗?
  • 很难说,没有一个工作的例子。 chisq 的定义遵循它的用途。这很奇怪。你确定,你的命名空间中的函数chisq 是你向我们展示的那个吗? free 是如何初始化的?不要用View检查变量的类型,使用str。再说一遍:请写一个可重现的例子。
  • 感谢您的评论@Bernhard chisq 是我自己的函数,free 被定义为 free
  • 您的尺寸好像换了? B[i,j] 尝试从第 i 个 row 和第 j 个 column 中选择元素?

标签: r for-loop


【解决方案1】:

使用

for(i in 1:15){
  for(j in 1:5){
    free[i, j]<-chisq(i,j)
  }
}

我。 e. i 是行,从 1 到 15,j 是列,从 1 到 5。

更好:使用像中一样的说话变量名

免费

for(row in 1:15){
  for(col in 1:5){
    free[row, col]<-chisq(row, col)
  }
}

使薄型错误更容易被发现。

【讨论】:

  • 非常感谢您的帮助! :D 我从循环中得到了正确的结果......我很傻:(问题中的前一个错误消息似乎发生在错误的数据结构上。(即 data.frame 而不是矩阵)不过,我没有知道为什么会这样,因为我单击了“从 csv 导入数据集”按钮,非常感谢您的大力帮助!温暖的拥抱,艾莉
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2011-09-19
  • 1970-01-01
  • 2015-06-05
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多