在dplyr中切割链接操作中的向量

zes*_*sla 2 r dplyr

如何用dplyr切割链接中的向量

v <- 1:10
#can be easily done with 
v[v > 5]
#use chaining 
v %>% ??
Run Code Online (Sandbox Code Playgroud)

我想让自己习惯链接......

G. *_*eck 11

使用这个:

library(magrittr)
v <- 1:10
Run Code Online (Sandbox Code Playgroud)

尝试以下任何一个:

1)extract从magrittr中提取使用

v %>% extract(. > 5)
## [1]  6  7  8  9 10
Run Code Online (Sandbox Code Playgroud)

2)[ extract是同义词,[所以这也有效:

v %>% `[`(. > 5)
## [1]  6  7  8  9 10
Run Code Online (Sandbox Code Playgroud)

3)子集这是类似的,但使用subset而不是extract[:

v %>% subset(. > 5)
## [1]  6  7  8  9 10
Run Code Online (Sandbox Code Playgroud)

4)Filter R提供Filter函数式编程功能:

v %>% Filter(f = . %>% { . > 5 })
## [1]  6  7  8  9 10
Run Code Online (Sandbox Code Playgroud)

4a)这是相同的但使用普通的匿名函数表示法:

v %>% Filter(f = function(x) x > 5)
## [1]  6  7  8  9 10
Run Code Online (Sandbox Code Playgroud)

更新:添加了附加解决方案,重新排列并添加了标题.


Ric*_*ven 9

纯粹的magrittr:

library(magrittr)
v <- 1:10

v %>% extract(is_greater_than(., 5))
# [1]  6  7  8  9 10
Run Code Online (Sandbox Code Playgroud)


ald*_*pia 8

您可以使用:

v %>% .[.>5] # . represent the object (valid for list, data.frame, etc)
[1]  6  7  8  9 10
Run Code Online (Sandbox Code Playgroud)

很好的答案,但更快(或至少稍快)?:

library(dplyr)
library(maggrittr)
library(microbenchmark)

microbenchmark(Base = v[v>5],
               Option1 = v %>% .[.>5],
               Option2 = v %>% `[`(. > 5),
               Option3 = v %>% subset(. > 5),
               Option4 = v %>% Filter(f = . %>% { . > 5 }),
               Option5 = v %>% subset(. > 5),
               Option6 = v %>% extract(is_greater_than(., 5)))

Unit: nanoseconds
    expr    min       lq      mean   median       uq    max neval   cld
    Base    461    727.0    822.21    785.5    880.5   1766   100 a    
 Option1  50383  53589.0  55699.46  54769.5  56297.0  76875   100  b   
 Option2  52408  56379.0  58837.53  57705.5  59769.5  76897   100  bc  
 Option3  62437  66398.5  68436.73  67941.5  69271.5  97161   100    d 
 Option4 125552 130317.0 134762.53 132480.5 135797.0 195510   100     e
 Option5  62167  66241.5  71737.07  67793.5  70266.0 267053   100    d 
 Option6  53986  57378.0  59683.31  58620.5  60410.5  91577   100   c  
Run Code Online (Sandbox Code Playgroud)

基本上它更快,但问题是链操作,所以选项1和2更适合这个目的

  • 值得注意的是,最佳和最差时间(平均值)之间的差异是0.000087秒,乘法差异从最佳到最差是大约2倍.我运行了一个比较"v [v> 5]"的基准测试,它比你赢得的'dplyr2`方法快了大约100倍.我想说的是:*如果你关心微秒级的效率,不要使用`magrittr`.如果你不关心几微秒,那么这些方法中的任何一种都是等价的 - 这没关系.* (4认同)
  • 我感谢您在基准测试中添加`base`选项,但我仍然不同意您的结论"1和2更适合".非基本选项之间的差异都不足以解决问题.如果你关心速度,你使用base.如果你不这样做,那只是个人偏好. (4认同)
  • @aldo,我认为你的意思是你可以使用库(dplyr)而不使用库(magrittr)但这只是因为dplyr导入和导出magrittr的部分.dplyr本身并没有增加任何东西. (3认同)