我一直在参加在线课程,在该课程中,讲师始终会执行以下操作来从Col1
对象data.frame
中获取列Dat
:
library(dplyr)
unlist(select(Dat, Col1))
为什么不简单地运行Dat$Col1
?我注意到两种结果的“表示形式”有所不同,但是两种形式之间是否还有其他重大差异?任何操作都会为两者带来相同的产品吗?
答案 0 :(得分:9)
(将评论发布为社区Wiki。)
这些不是相当等效项-unlist(select(.))
保留(可能是不需要的)名称。
dd <- data.frame(Col1=c("abc","def"))
str(unlist(select(dd,Col1)))
## Factor w/ 2 levels "abc","def": 1 2
## - attr(*, "names")= chr [1:2] "Col11" "Col12"
str(dd$Col1)
## Factor w/ 2 levels "abc","def": 1 2
您的讲师可能只是tidyverse(@ RichScriven)的粉丝; pull(Dat, Col1)
或(对于极端“整洁”)Dat %>% pull(Col1)
会更惯用(@Henrik)。 Dat$Col1
或Dat[["Col1"]]
将是base-R的等效项(前者对于交互式使用更方便,后者对于编程目的则更为安全,因为它不会进行名称补全)。
没关系,但是整股方法要慢得多。
microbenchmark(dd$Col1,dd[["Col1"]],pull(dd,Col1),unlist(select(dd,Col1)))
Unit: microseconds
expr min lq mean median uq
dd$Col1 5.296 10.9630 14.86871 13.4040 17.160
dd[["Col1"]] 7.870 9.6535 15.18874 11.8270 16.635
pull(dd, Col1) 44.160 108.7625 128.89342 117.8415 136.890
unlist(select(dd, Col1)) 601.480 1132.8240 1436.44178 1214.4420 1378.141
max neval cld
31.036 100 a
88.842 100 a
422.462 100 a
8796.964 100 b