2017-01-23 85 views
0

我知道使用lazyeval内部功能,以指代列名与dplyr但我坚持的。一般来说,当创建一个函数时,它也引用了函数参数中的列名,使用这种函数最常用的方法是什么?谢谢。使用dplyr传递函数内列名

library(lazyeval) 

## Create data frame 
df0 <- data.frame(x=rnorm(100), y=runif(100)) 

########################################## 
## Sample mean; this way works 
########################################## 
df0 %>% 
    filter(!is.na(x)) %>% 
    summarize(mean=mean(x)) 

########################################## 
## Sample mean via function; does not work 
########################################## 
dfSummary2 <- function(df, var_y) { 
    p <- df %>% 
     filter(!is.na(as.name(var_y))) %>% 
     summarize(mean=mean(as.name(var_y))) 
    return(p) 
} 

dfSummary(df0, "x") 
# mean 
# 1 NA 
# Warning message: 
# In mean.default("x") : argument is not numeric or logical: returning NA 

########################################## 
## Sample mean via function; also does not work 
########################################## 
dfSummary <- function(df, var_y) { 
    p <- df %>% 
     filter(!is.na(var_y)) %>% 
     summarize(mean=mean(var_y)) 
    return(p) 
} 

dfSummary(df0, "x") 
# mean 
# 1 NA 
# Warning message: 
# In mean.default("x") : argument is not numeric or logical: returning NA 
+0

你将不得不使用'summarize_'和'代替filter_'功能。参见例如[这里](http://stackoverflow.com/questions/41810320/how-to-correctly-use-dplyr-verbs-inside-a-function-definition-in-r)。 – Axeman

+0

谢谢。顺便说一句,是使用** lazyeval :: interp **所需? – David

回答

1

注释使用summarize_filter_是正确的方向,如果使用dplyr更多信息,请与vignette("nse")

虽然与给定的问题,这将提供一个使用一个变量的列名,而无需dplyr

dfSummary <- function(df, var_y) { 
mean(df[[var_y]], na.rm = TRUE) 
} 

dfSummary(df0, "x") 
[1] 0.105659 

dfSummary(df0, "y") 
[1] 0.4948618 
+0

谢谢。我实际上知道这种方法,但由于我的脚本广泛使用** dplyr **,我想保留它的功能。 – David

相关问题