我主要是用Python编写程序,但现在我正在学习统计编程语言R。我注意到这两种语言之间存在一些差异。
假设v是一个向量/数组,其中包含从1到5(包括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还有没有其他我需要注意的陷阱?
发布于 2011-01-01 21:26:07
在用两种语言编写了数以万计的代码之后,R比Python更独特,一致性也更差。它非常适合在中小型数据集上进行快速绘图和调查,主要是因为它内置的dataframe对象比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"有很多这样的角落和缝隙。开始时你最好的朋友是内省和在线帮助工具,比如str、class、example,当然还有help。此外,请务必查看R Graph Gallery和里普利的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天哪!将一些东西从一个因子转换回一个数字实际上并没有完成你所认为的转换。相反,它是在因子的内部枚举类型上执行此操作。对于没有意识到这一点的人来说,这是一个很难找到的bug的来源,因为它仍然返回整数,并且实际上在某些时候(当输入已经是按数字排序的时候)会工作。
这才是你真正需要做的
> as.numeric(levels(xx))[xx]
[1] 3 2 3 4是的,当然,这一事实在factor帮助页面上有,但只有当你在这个错误中损失了几个小时时,你才会在那里登陆。这是R没有做你想做的事情的另一个例子。对于任何涉及类型转换或访问数组和列表的元素的事情,都要非常非常小心。
发布于 2011-01-01 21:00:12
这并不是专门讨论Python与R的背景,但是R inferno对于使用R的程序员来说是一个很好的资源。
发布于 2014-06-02 22:54:56
这篇文章的公认答案可能有点过时了。Pandas Python库现在提供了惊人的类似R的DataFrame支持。
https://stackoverflow.com/questions/4574002
复制相似问题