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

时间:2019-01-05 20:46:15

标签: r dplyr

我一直在参加在线课程,在该课程中,讲师始终会执行以下操作来从Col1对象data.frame中获取列Dat

library(dplyr)
unlist(select(Dat, Col1))

为什么不简单地运行Dat$Col1?我注意到两种结果的“表示形式”有所不同,但是两种形式之间是否还有其他重大差异?任何操作都会为两者带来相同的产品吗?

1 个答案:

答案 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$Col1Dat[["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