你有没有遇到过某些R语言的坑让你感到惊讶?我认为我们都可以从分享这些经验中受益。
下面是我的经历:在列表索引中,my.list[[1]]
不等于my.list[1]
。我在开始学习R的早期就了解了这一点。
seq_along()
函数,而不是像1:length(x)
这样的东西。
< p>在这里,我创建了一个向量,两种方法都返回相同的结果:> x <- 1:10
> 1:length(x)
[1] 1 2 3 4 5 6 7 8 9 10
> seq_along(x)
[1] 1 2 3 4 5 6 7 8 9 10
现在将向量设为NULL
:
> x <- NULL
> seq_along(x) # returns an empty integer; good behavior
integer(0)
> 1:length(x) # wraps around and returns a sequence; this is bad
[1] 1 0
这可能会在循环中引起一些混淆:
> for(i in 1:length(x)) print(i)
[1] 1
[1] 0
> for(i in seq_along(x)) print(i)
>
当您加载数据时自动创建因子。 您可能会不假思索地将数据框中的一列视为字符,并且在尝试将值更改为不是级别的值时,这通常效果良好。 这会生成警告,但会将数据框中的值设置为NA ...
如果您的R脚本出现意外错误,请检查因子是否有问题。
options("stringsAsFactors"=FALSE)
来更改这一点,从而避免将字符串作为因子处理。 - Dirk Eddelbuetteldata.frame
жһ„йҖ еҮҪж•°ж—¶гҖӮиҝҷд№ҹжӣҫз»ҸеӨҡж¬Ўи®©жҲ‘жҺӘжүӢдёҚеҸҠгҖӮ - prabhasp在将矩阵子集减少到单个维度时,忘记使用drop=FALSE参数,从而同时丢失对象类:
R> X <- matrix(1:4,2)
R> X
[,1] [,2]
[1,] 1 3
[2,] 2 4
R> class(X)
[1] "matrix"
R> X[,1]
[1] 1 2
R> class(X[,1])
[1] "integer"
R> X[,1, drop=FALSE]
[,1]
[1,] 1
[2,] 2
R> class(X[,1, drop=FALSE])
[1] "matrix"
R>
删除数据框中的行会导致添加了非唯一命名的行,进而出现错误:
> a<-data.frame(c(1,2,3,4),c(4,3,2,1))
> a<-a[-3,]
> a
c.1..2..3..4. c.4..3..2..1.
1 1 4
2 2 3
4 4 1
> a[4,1]<-1
> a
Error in data.frame(c.1..2..3..4. = c("1", "2", "4", "1"), c.4..3..2..1. = c(" 4", :
duplicate row.names: 4
这里的情况是:
创建一个四行数据框,所以行名为c(1,2,3,4)
删除第三行,所以行名变成了c(1,2,4)
添加了第四行,R自动将行名设置为索引即4,因此行名为c(1,2,4,4)。这是非法的,因为行名应该是唯一的。我不明白为什么R允许这种类型的行为。在我看来,R应该提供一个唯一的行名。
4.1 1 NA
。 - Nick Kennedy首先,我要说我理解用二进制系统表示数字的基本问题。然而,我认为可以很容易地改进一个问题,那就是当十进制值超出R的典型表示范围时,数字的表示方式。
x <- 10.2 * 100
x
1020
as.integer(x)
1019
如果结果可以表示为整数,那么我不介意将其表示为整数。例如,如果值确实为1020,则将其打印为x是可以的。但是,在此情况下在打印x时加上像1020.0这样简单的内容会更明显地表明该值不是整数且不能表示为整数。当存在极小的小数部分未显示时,R应默认显示某种指示。
1.000000000001
将打印为 1.
;另一种选择是在整数后面打印显式的 L
,但那样会很丑。 - Ben Bolker必须考虑到NA
、NaN
和Inf
的组合可能会让人感到烦恼。它们的行为有所不同,对其中一个进行测试并不一定适用于其他的情况。
> x <- c(NA,NaN,Inf)
> is.na(x)
[1] TRUE TRUE FALSE
> is.nan(x)
[1] FALSE TRUE FALSE
> is.infinite(x)
[1] FALSE FALSE TRUE
然而,测试这些麻烦制造者最安全的方法是:
> is.finite(x)
[1] FALSE FALSE FALSE
NA
理解为“我还不知道”,但我的解释与is.infinite(NA)
和is.finite(NA)
返回的“FALSE”不一致:我原本预期的是NA
。 - mariotomo始终测试当您有一个 NA
时会发生什么!
在许多痛苦的经历之后,我始终需要特别注意的一件事情就是 NA
值。R函数易于使用,但编程方式无法克服数据问题。
例如,任何带有 NA
的向量操作都等于 NA
。这在表面上看似乎有些“令人惊讶”:
> x <- c(1,1,2,NA)
> 1 + NA
[1] NA
> sum(x)
[1] NA
> mean(x)
[1] NA
这会被推广到其他更高级的函数中。
换句话说,默认情况下,缺失值通常与测量值一样重要。许多函数具有na.rm=TRUE/FALSE
默认值;值得花些时间决定如何解释这些默认设置。
编辑1:Marek提出了一个很好的观点。 NA
值还会在索引中导致混乱的行为。例如:
> TRUE && NA
[1] NA
> FALSE && NA
[1] FALSE
> TRUE || NA
[1] TRUE
> FALSE || NA
[1] NA
当你尝试创建条件表达式(用于if语句)时,这也是正确的:
> any(c(TRUE, NA))
[1] TRUE
> any(c(FALSE, NA))
[1] NA
> all(c(TRUE, NA))
[1] NA
当这些 NA 值成为您的向量索引时,可能会出现许多意想不到的情况。对于 R 来说,这都是良好的行为,因为这意味着您必须小心处理缺失值。但是,这可能会在开始时引起重大头痛。
(1:3)[c(TRUE,FALSE,NA)]
会得到1,NA
。当你在一个包含NA的向量上创建逻辑向量(1:3)[c(1,2,NA)<2]
时,很容易陷入这种情况。 - Marekround
函数总是向最接近的偶数舍入。
> round(3.5)
[1] 4
> round(4.5)
[1] 4
忘记了 strptime()
和相关函数返回的是 POSIXt POSIXlt
,其中 length()
总是九 -- 转换为 POSIXct
会有所帮助:
R> length(strptime("2009-10-07 20:21:22", "%Y-%m-%d %H:%M:%S"))
[1] 9
R> length(as.POSIXct(strptime("2009-10-07 20:21:22", "%Y-%m-%d %H:%M:%S")))
[1] 1
R>
整数的数学运算与双精度浮点数(有时复数也很奇怪)的运算略有不同。
更新:在 R 2.15 中修复了一些问题。
1^NA # 1
1L^NA # NA
(1+0i)^NA # NA
0L %/% 0L # 0L (NA from R 2.15)
0 %/% 0 # NaN
4L %/% 0L # 0L (NA from R 2.15)
4 %/% 0 # Inf
if { ... } \n else { ... }
。 - Tomaschoose
函数。choose(n, k)
不是n
元素集合中k
元素子集的数量。例如,choose(-4,2) == 10
。 - Flounderer