如何用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)
更新:添加了附加解决方案,重新排列并添加了标题.
纯粹的magrittr:
library(magrittr)
v <- 1:10
v %>% extract(is_greater_than(., 5))
# [1] 6 7 8 9 10
Run Code Online (Sandbox Code Playgroud)
您可以使用:
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更适合这个目的