我正在尝试使用dplyr和%>%符号进行多项选择。 什么有效:
select(data, b1:b10) / select(data, v1:v10)
我想做什么:
data %>% select(b1:b10)/select(v1:v10)
答案 0 :(得分:1)
怎么样?
#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)
我还有一个名为withX的辅助函数,我在这种情况下使用了很多
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
现在我意识到所有这些替代方法都不是紧凑的&#34;在较少的字符意义上。但是您只需要指定一次data.frame名称。所以就是这样。