r - 使用 dplyr 包中的 select + unlist 和使用美元符号有什么区别?
问题描述
我一直在参加在线课程,在该课程中,讲师总是执行以下操作来获取Col1
对象data.frame
的列Dat
:
library(dplyr)
unlist(select(Dat, Col1))
为什么不简单地运行Dat$Col1
?我注意到两种结果的“呈现方式”有所不同,但两种形式之间是否存在其他显着差异?任何操作都会导致两者的产品相同?
解决方案
(以社区 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
推荐阅读
- javascript - Dynamically Split a table cell into multiple columns depending on the comma
- python - 如何同时运行阻塞函数?
- php - 从 Curl 输出字符串数据类型数据中过滤掉 json 字符串
- c++ - C++ SFINAE 没有失败
- python - 在 Panda 中选择列
- php - 需要时在 Codeigniter 中保存活动复选框的值
- mysql - 如何在mysql中的相应列的单行中获取多个行值
- javascript - JavaScript Axios 循环
- c - 如果语句条件未满足但程序卡住
- python-3.x - 当 matplotlib 不支持时,altair 输出“输入类型不支持 ufunc 'isinf'”错误