使用dplyr包中的select + unlist和使用美元符号有什么区别?

G. *_*iro 9 r dplyr

我一直在服用的在线课程中教师总是做以下获得,也就是说,该列Col1从一个data.frame对象Dat:

library(dplyr)
unlist(select(Dat, Col1))
Run Code Online (Sandbox Code Playgroud)

为什么不简单地跑Dat$Col1?我注意到两种结果的"表述"存在差异,但这两种形式之间是否存在其他重大差异?任何操作都会为两者产生相同的产品?

Ben*_*ker 9

(将评论发布为社区维基.)

这些并不完全等同 - 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
Run Code Online (Sandbox Code Playgroud)

你的导师可能只是tidyverse的粉丝(@RichScriven); pull(Dat, Col1)或者(对于极端的"整洁")Dat %>% pull(Col1)会更加惯用(@Henrik).Dat$Col1或者Dat[["Col1"]]是基本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
Run Code Online (Sandbox Code Playgroud)

  • 既然你提到它,`pull(dd,Col1)`的速度是`dd%>%pull(Col1)`的两倍.测试了更大的`dd < - data.frame(Col1 = sample(c("abc","def"),1e6,TRUE))`. (2认同)