2017-01-23 65 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

相關問題