R程序员的R陷阱

Bio*_*eek 16 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
Run Code Online (Sandbox Code Playgroud)

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

ram*_*jan 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
Run Code Online (Sandbox Code Playgroud)

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

> class(v)
[1] "matrix"
> class(u)
[1] "matrix"
> class(w)
[1] "integer"
Run Code Online (Sandbox Code Playgroud)

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

> w2 = u[,1,drop=FALSE]
> w2[1,1]
[3] 1
> class(w2)
[1] "matrix"
Run Code Online (Sandbox Code Playgroud)

那里有很多角落和缝隙.一开始你最好的朋友会反省和联机帮助工具,如str,class,example,当然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
Run Code Online (Sandbox Code Playgroud)

天啊!将某个因子从某个因子转换回数字实际上并没有进行您认为会发生的转换.相反,它是在内部枚举类型的因子上进行的.对于那些不知道这一点的人来说,这是一个难以发现的错误的来源,因为它仍然会返回整数,实际上实际上会在某些时候工作(当输入已经按数字排序时).

这是你真正需要做的

> as.numeric(levels(xx))[xx]
[1] 3 2 3 4
Run Code Online (Sandbox Code Playgroud)

是的,当然,这个事实是在factor帮助页面上,但是当你在这个错误中丢失了几个小时之后,你才会到达那里.这是R如何不做你想要的另一个例子.对涉及类型转换或访问数组和列表元素的任何事情都要非常小心.


Chr*_*ian 14

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

  • R Inferno指针的+1 - R"陷阱"的一个很好的参考 (3认同)

Mik*_*lla 7

这篇文章的接受答案可能有点过时了.该大熊猫 Python库现在提供惊人的R-像数据帧的支持.