【问题标题】:Pitfalls in R for Python programmersPython 程序员在 R 中的陷阱
【发布时间】:2011-01-01 12:11:47
【问题描述】:

我主要使用 Python 进行编程,但我现在正在学习统计编程语言 R。我注意到这两种语言之间存在一些差异。

假设v 是一个向量/数组,包含从 1 到 5 的整数。

v[3]  # in R: gives me the 3rd element of the vector: 3
      # in Python: is zero-based, gives me the integer 4
v[-1] # in R: removes the element with that index
      # in Python: gives me the last element in the array

还有其他需要注意的陷阱吗?

【问题讨论】:

  • v[3] 在 python 中为您提供序列的第四个元素。在给定的情况下,这将是4
  • @SilentGhost:当然,修正了错误。
  • 标题并不能准确地代表这里的问题——这些不是“R 中的陷阱”,它们只是两种不同语言之间的基本区别。无论如何,v[-1] 不会“删除索引为 1 的元素”,它会返回一个包含除第一个元素之外的每个元素的新向量。
  • @mdsumner:我完全不同意。如果你的向量 v 有 100M 个元素,那么“意外”隐式地创建一个具有 100M-1 个元素的新向量 v[-1] 会很慢,很痛苦,也很错误。所以,这是一个陷阱。

标签: python r


【解决方案1】:

在用两种语言编写了数万行代码后,R 与 Python 相比更加特殊且一致性更低。对中小型数据集进行快速绘图和调查非常好,主要是因为它的内置数据框对象比 numpy/scipy 等效对象更好,但是当你做的事情比它更复杂时,你会发现各种奇怪的东西一个衬垫。我的建议是使用rpy2(不幸的是,它的 UI 比它的前身 rpy 差得多),并且尽可能少地在 R 中做,其余的在 Python 中。

例如,考虑以下矩阵代码:

> u = matrix(1:9,nrow=3,ncol=3)
> v = u[,1:2]
> v[1,1]
[2] 1
> w = u[,1]
> w[1,1]
Error in w[1, 1] : incorrect number of dimensions

那是怎么失败的?原因是,如果您从沿任何给定轴只有一列的矩阵中选择一个子矩阵,R“有用地”删除该列并更改变量的类型。所以 w 是整数向量而不是矩阵:

> class(v)
[1] "matrix"
> class(u)
[1] "matrix"
> class(w)
[1] "integer"

为避免这种情况,您需要实际传递一个晦涩的关键字参数:

> w2 = u[,1,drop=FALSE]
> w2[1,1]
[3] 1
> class(w2)
[1] "matrix"

有很多这样的角落和缝隙。一开始你最好的朋友将是内省和在线帮助工具,如strclassexample,当然还有help。此外,请务必查看 R Graph Gallery 和 Ripley 的 Modern Applied Statistics with S-Plus 书中的示例代码。


编辑:这是另一个很好的因子示例。

> xx = factor(c(3,2,3,4))
> xx
[1] 3 2 3 4
Levels: 2 3 4
> yy = as.numeric(xx)
> yy
[1] 2 1 2 3

天哪!将某个因素从一个因子转换回一个数字实际上并没有进行您认为的转换。相反,它是在因子的内部枚举类型上进行的。对于不知道这一点的人来说,这是一个难以发现的错误来源,因为它仍在返回整数并且实际上在某些时间实际上会起作用(当输入已经是数字时)订购)。

这是你真正需要做的事情

> as.numeric(levels(xx))[xx]
[1] 3 2 3 4

是的,当然,这个事实在factor 帮助页面上,但只有当你为这个错误浪费了几个小时时,你才会到达那里。这是 R 不按照您的意图执行的另一个示例。任何涉及类型转换或访问数组和列表元素的事情都要非常非常小心。

【讨论】:

  • 很抱歉,这只是个人意见。您确实可能对某些默认值不满意,或者发现它“不那么特别”,但就其设计而言,R 在我的个人意见中胜过 Python。我刚刚习惯了 R 的工作方式,并且由于您经常从矩阵中选择一行或一列来对其进行 矢量化 计算,因此默认的 drop=T 并不是那么不合逻辑。
  • 嗯,当然,但是你可以乘一个 n x 1 矩阵,就像你可以乘一个长度为 n 的向量一样。没有理由强制进行类型转换。无论如何,我们只是说这不是任何其他矩阵语言库(包括 numpy)中的行为,因此与作者的原始问题相关:陷阱 :)
  • “就其设计而言,R 的性能优于 Python”当然,我并不否认这一点。对于数据集或统计图形的快速调查,R 是无与伦比的。我唯一的建议是,一旦你完成了,你希望在对 rpy2 的单个函数调用中保持对 R 的任何生产使用孤立。
  • R Graph Gallery 似乎走到了尽头。
【解决方案2】:

这并不是专门针对 Python 与 R 的背景,但 R inferno 是一个很好的资源,适合即将使用 R 的程序员。

【讨论】:

  • +1 for R Inferno 指针——R“陷阱”的一个很好的参考
【解决方案3】:

这个帖子的公认答案可能有点过时了。 Pandas Python 库现在提供了惊人的类似 R 的 DataFrame 支持。

【讨论】:

    【解决方案4】:

    可能有......但在开始之前,您是否尝试过一些可用的 Python 扩展? Scipy 有一个列表。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2015-06-06
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多