我正在尝试使用dplyr和%>%符号进行多项选择。什么有效:
select(data, b1:b10) / select(data, v1:v10)
我想做的是:
data %>% select(b1:b10)/select(v1:v10)
关于什么
#sample data
data<-data.frame(matrix(runif(20*45), ncol=20,
dimnames=list(NULL, paste0(rep(c("b","v"), each=10),1:10))) )
#orig
A<-select(data, b1:b10) / select(data, v1:v10)
#proposed
B<-data %>% function(X) {select(X, b1:b10)/select(X, v1:v10)}
#verify they are the same
all(A==B)
C <- data %>% withX( select(X, b1:b10) / select(X, v1:v10) )
all(C==A)
# [1] TRUE
或者在这种情况下,我们可能希望使用另一个帮助程序功能来处理链并创建不同子集的列表。考虑功能each
each<-function(.data, ...) {
dots <- substitute(list(...))[-1]
force(.data)
e<-environment()
parent.env(e)<-parent.frame()
lapply(dots, function(x) {
eval(bquote(.data %>% .(x)), e)
})
}
此函数将为dplyr
您传入的每个参数执行链接。因此您可以执行
D <- data %>% each(select(b1:b10), select(v1:v10)) %>% Reduce(`/`, .)
all(A==D)
# [1] TRUE
现在,我意识到所有这些替代方法在字符更少的意义上并不是“紧凑的”。但是您只需要指定一次data.frame名称。就是这样。
本文收集自互联网,转载请注明来源。
如有侵权,请联系[email protected] 删除。
我来说两句