Dplyr,过滤器和SE

时间:2016-01-28 11:48:45

标签: r dplyr

我的数据框有3列A,B,C和 我想构建一个函数,只保留列A低于另一列的行(可以是列B或C)

我知道我们需要使用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)
}

3 个答案:

答案 0 :(得分:0)

filter_内的表达式转换为字符串是一种方法:

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

答案 1 :(得分: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)

答案 2 :(得分:0)

这是与字符输入/ SE一起使用的功能。

fct = function(df, column_name){
  #convert to sym from chr
  column_name = sym(column_name)

  #filter
  df %>% filter(columnA < column_name)
}

测试:

> df %>% fct("columnB") %>% head()
  columnA  columnB  columnC
1       1 68.80929 56.49032
2       2 58.17927 68.06920
3       3 57.52833 66.00263
4       4 41.38442 57.58875
5       5 38.93989 61.93183
6       6 51.10835 54.70835

我是not sure why,必须先打sym()电话。