在提取数据框或者maxtrix数据的时候我们喜欢使用[,], 那么我们应该养成习惯:始终使用drop=FALSE参数。
R中,单列数据框经常会被转换成因子:
d <- data.frame(x = seq_len(3))
print(d)
#> x
#> 1 1
#> 2 2
#> 3 3
d[order(-d$x), ]
#> [1] 3 2 1
# 注意,我们得到的是因子!
上面例子中,我们的本意是对x进行排序,结果得到了因子,d[,]
也会得到同样结果
而加上drop=FALSE
就能避免这种 情况
d[order(-d$x), , drop = FALSE]
#> x
#> 3 3
#> 2 2
#> 1 1
# 得到的依然是数据框
为了安全起见,在对数据框取数据时鼓励以下类似list的做法(毕竟数据框可以看作是column的list)
d[["x"]]
#> [1] 1 2 3
d$x
#> [1] 1 2 3
d[[1]]
#> [1] 1 2 3
结论
不管对象是不是单列,始终加上drop=FALSE
参数,write mtcars[, c("mpg", "cyl"), drop = FALSE]
instead of mtcars[, c("mpg", "cyl")]