R程序员的R陷阱

时间:2011-01-01 12:11:47

标签: python r

我主要用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

我还需要注意其他任何陷阱吗?

4 个答案:

答案 0 :(得分:20)

在这两种语言中编写了成千上万行代码后,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如何不做你想要的另一个例子。对涉及类型转换或访问数组和列表元素的任何事情都要非常小心。

答案 1 :(得分:14)

这不是专门针对Python与R的背景,但R inferno对于来到R的程序员来说是一个很好的资源。

答案 2 :(得分:7)

这篇文章的接受答案可能有点过时了。 Pandas Python库现在提供了类似R的DataFrame支持。

答案 3 :(得分:1)

可能有......但在你开始之前,你尝试了一些可用的Python扩展吗? Scipy有一个列表。