尝试以更紧凑的方式在dplyr中使用select

时间:2014-09-09 03:18:42

标签: r dplyr

我正在尝试使用dplyr和%>%符号进行多项选择。 什么有效:

   select(data, b1:b10) / select(data, v1:v10)

我想做什么:

data %>% select(b1:b10)/select(v1:v10)   

1 个答案:

答案 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名称。所以就是这样。