我的数据框有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)
}
答案 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()
电话。