Dplyr,过滤器和SE

3
我有一个包含三列A、B、C的数据框,我想要构建一个函数,只保留A列小于另外一列(可以是B列或C列)的行。
我知道我们需要使用dplyr中的filter_和SE来实现这个功能,我看了vignette但是不理解它是如何工作的。
我该如何将这个函数转换成一个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)
}

@psql,什么是NSE函数? - Marta
非标准评估 https://cran.r-project.org/web/packages/dplyr/vignettes/nse.html - user3904098
也许 这个 问答可以帮到你。你可能需要用到 filter_ - David Arenburg
只是为了确保您对命名法的清晰理解,函数fct正在使用NSE,这是dplyr的默认设置。带有下划线结尾的函数(filter_)是使用SE的函数。 - NGaffney
@NGaggney:哦,是的,我犯了一个错误,抱歉。 - user3904098
3个回答

1

将您在 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
这是一个可以处理字符输入/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

不确定为什么要先调用sym()


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接