首页 > 解决方案 > 使用 dplyr 包中的 select + unlist 和使用美元符号有什么区别?

问题描述

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

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

为什么不简单地运行Dat$Col1?我注意到两种结果的“呈现方式”有所不同,但两种形式之间是否存在其他显着差异?任何操作都会导致两者的产品相同?

标签: rdplyr

解决方案


(以社区 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 等价物(前者更便于交互使用,后者对于编程目的稍微安全一些,因为它不会进行名称补全)。

这无关紧要,但 tidyverse 方法要慢得多。

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

推荐阅读