【问题标题】:What's the difference between using select + unlist from dplyr package and using the dollar sign?使用 dplyr 包中的 select + unlist 和使用美元符号有什么区别?
【发布时间】:2019-01-06 05:13:35
【问题描述】:

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

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

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

【问题讨论】:

  • 您的导师可能只是 tidyverse 的粉丝。 Dat$Col1 是我获取列的首选方法。
  • ...但不是很好-versed 足以知道pull
  • 触摸。也许 OP 可以带老师去学校。
  • 哇,他为此加载了一个全新的库?
  • 关于SO事件的谣言spread,导师决定gatherevery学生。 today 他已经开始select 没有filter 的香烟,并且花了很长时间,很深的pullcompose 自己为minute。这是母马的nest。 “嗯,我有乌鸦到pluck 和你一起,who 是这样做的吗?”,老师开口。 “between你和我:这是nofuns。你最好不要cross我,否则我会reduce你的成绩,every成绩。不管你怎么选slice它——period!”学生们面面相觑。 complete 闹剧。新的快乐yearevery 一-tally-ho!

标签: r dplyr


【解决方案1】:

(将 cmets 发布为社区 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 %&gt;% pull(Col1) 会更惯用(@Henrik)。 Dat$Col1Dat[["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

【讨论】:

  • 既然你提到了,pull(dd, Col1) 的速度是dd %&gt;% pull(Col1) 的两倍。使用更大的dd &lt;- data.frame(Col1 = sample(c("abc", "def"), 1e6, TRUE)) 进行测试。
  • 请注意,基本 R 函数总是有 use.names 参数unlist,它将删除任何不需要的名称:unlist(select(.), use.names=FALSE)
猜你喜欢
  • 2014-04-15
  • 2014-12-19
  • 2020-01-17
  • 2015-08-05
  • 2021-08-20
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2013-12-01
相关资源
最近更新 更多