2017-01-23 4 views
0

Я знаю, используя lazyeval внутри функции для того, чтобы ссылаться на имена столбцов с dplyr, но я застрял. В общем случае при создании функции, которая использует 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