2016-01-28 3 views
2

У меня есть кадр данных с 3 столбцами A, B, C и Я хотел бы построить функцию, чтобы хранить строки только там, где столбец А ниже в другой столбец (может быть столбцом B или C)Dplyr, filter и SE

Я знаю, что нам нужно использовать filter_ и SE, чтобы сделать это возможным с помощью dplyr, и я посмотрел на виньетку, но я не понимаю, как это работает ».

Как я могу преобразовать эту функцию в функцию SE?

df = data.frame(columnA = 1:100, 
       columnB = rnorm(100, 50, 10), 
       columnC = rnorm(100, 50, 10)) 

fct = function(df,column_name){ 
    df2 = df %>% filter(columnA < column) 
return(df2) 
} 
+0

@psql, что такое 'функция NSE'? – Marta

+0

Нестандартная оценка https://cran.r-project.org/web/packages/dplyr/vignettes/nse.html –

+0

Возможно [это] (http://stackoverflow.com/questions/34922586/r-make- функция-робаст-к-обе-стандарт-и-не-стандартная-оценка) Q/A может помочь вам. Вам, вероятно, понадобится 'filter_' –

ответ

0

Преобразование ваше выражение внутри filter_ в строку это один из способов сделать это:

fct = function(df, column_name){ 
    df2 = df %>% filter_(paste("columnA <", column_name)) 
    return(df2) 
} 
nrow(fct(df, "columnB")) 
## [1] 50 
0

ответ NGaffney является версия SE. Вот версия NSE, а это означает, что позволяет ввести в кавычки имя столбца:

require(dplyr) 
df = data.frame(columnA=20, columnB=50, columnC=15) 

fct = function(df,column_NSE){ 
    column_name = deparse(substitute(column_NSE)) 
    df2 = df %>% filter_(paste("columnA < ", column_name)) 
    return(df2) 
} 

Тестовый прогон:

> fct(df,columnB) 
    columnA columnB columnC 
1  20  50  15 

> fct(df,columnC) 
[1] columnA columnB columnC 
<0 rows> (or 0-length row.names) 
+0

Добро пожаловать. –

Смежные вопросы