【问题标题】:R Error: replacement diagonal has wrong lengthR错误:替换对角线长度错误
【发布时间】:2014-11-21 18:25:17
【问题描述】:

我正在尝试调试这行 R 代码,它是用 R 版本 2.3.x 编写并与 R 版本一起使用并使用 rpy 调用的,但现在移至 2.15.3 和 rpy2,它似乎坏了?我的矩阵非常大,长度为 409x409,对角线填充了浮点整数(我认为?)。我正在查看拉入的原始矩阵文件,并且诊断文件中填充了 99999.00。其余单元格的格式为##.##

有问题的代码行:

diag(mymatrix) <- apply(mymatrix, 1, function(x) min(x[x>0], na.rm=T)) * 0.73

返回以下错误:

Traceback(最近一次调用最后一次): 文件“”,第 1 行,在 调用中的文件“C:\Python27\lib\site-packages\rpy2\robjects\functions.py”,第 166 行 return super(SignatureTranslatedFunction, self).call(*args, **kwargs) 调用中的文件“C:\Python27\lib\site-packages\rpy2\robjects\functions.py”,第 99 行 res = super(Function, self).call(*new_args, **new_kwargs) RRuntimeError: diag&lt;-(*tmp*, value = c(72999.27, 1.39576, 2.79616323829879, 中的错误: 替换对角线长度错误

我查看了the SVN.R website 以了解diag函数的内部工作原理,看看错误来自哪里:

if (len.v != 1L && len.v != len.i)
stop("replacement diagonal has wrong length")

我认为这告诉了我我的答案,我的替换值不是正确的长度,对吧?那么我该如何让我的替换对角线长度合适,以便“粘住”呢?

编辑——添加了用于故障排除的上下文——

这个矩阵最初是通过 Python 脚本生成为 409x409 数组(使用 numpy),并使用 ro.r.assign 分配。然后,在我的 R 脚本中,mymatrix 最初(以 R 版本 2.3.1 形式)在使用中调用:

mymatrix &lt;- do.call("rbind", mymatrix)

但现在在 2.15.3 和 Rpy2 中,我在数组上使用这个 do.call 时遇到了错误。它会给我以下错误:

文件“”,第 1 行,在 调用中的文件“C:\Python27\lib\site-packages\rpy2\robjects\functions.py”,第 166 行 return super(SignatureTranslatedFunction, self).call(*args, **kwargs) 调用中的文件“C:\Python27\lib\site-packages\rpy2\robjects\functions.py”,第 99 行 res = super(Function, self).call(*new_args, **new_kwargs) RRuntimeError: do.call("rbind", mymatrix) 中的错误:第二个参数必须是一个列表

所以我的“修复”是简单地使用as.list 将其转换为如下所示的列表:

mymatrix &lt;- do.call("rbind", as.list(mymatrix))

但是现在进一步思考这个问题,我突然想到这可能就是问题所在。我是否需要再次将其转换回对角线才能正常工作,如果需要,如何?

谢谢!

【问题讨论】:

  • apply 函数返回多少个值? mymatrix 中有 NA 吗?
  • 这是个好问题。您能否阅读我上面的 EDIT 以获取更多上下文?矩阵中有 NA,但它们最初是作为 numpy 数组传递的。但是,我遇到了这个问题并将其转换为列表。可能是我需要重新转换它然后执行对角线,但这就是我迷路的地方。
  • do.call(rbind, as.list(mymatrix)) 会将您的正方形 [409 x 409] 矩阵转换为 [409*409 x 1] 矩阵,因此这很可能是个问题。你为什么要这样做呢?还是调用 rbind?
  • 啊..那么我该如何重新转换它?另外,有没有比 do.call rbind 更好的方法?这段代码不是我写的——它是大约 10 年前由别人写的。我正在努力通过清理这段代码并在此过程中调试我的模型来学习 R 和 Python 以及所有这些东西。 ://
  • 在那一行,如果 mymatrix 已经是一个矩阵,那么 rbinding 没有任何意义。该行之前的str(mymatrix) 是什么?我已经很久没有使用 r 了,所以我不能说在破坏此代码的更改之前 do.call 是如何工作的

标签: r rpy2


【解决方案1】:

正如@rawr 所指出的,do.call(rbind, as.list(mymatrix)) 返回一个 409x409 x 1 矩阵,因此,对角函数无法正确表述。解决方案是通过 R 包plyrdo.call 替换为rbind.fill,它成功地以正确的形式引入了矩阵,然后diag 函数按其应有的方式执行。

【讨论】:

  • 我还要补充一点,plyr 非常有用,在 R 中处理矩阵时可以大大提高性能!
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2017-01-25
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多