【问题标题】:Dplyr, filter and SEDplyr、过滤器和 SE
【发布时间】:2019-04-25 06:21:43
【问题描述】:

我有一个包含 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)
}

【问题讨论】:

  • @psql,NSE 函数是什么?
  • 也许this Q/A 可以帮助你。你可能需要filter_
  • 为了确保您清楚命名法,fct 函数使用 NSE,这是 dplyr 默认值。以“_”结尾的函数(filter_)是使用 SE 的函数。
  • @NGaggney:哦,是的,我弄错了,对不起

标签: r dplyr


【解决方案1】:

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

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

【讨论】:

    【解决方案2】:

    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)
    

    【讨论】:

      【解决方案3】:

      这是一个适用于字符输入/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()

      【讨论】:

        猜你喜欢
        • 2016-06-28
        • 2019-03-13
        • 1970-01-01
        • 2017-05-06
        • 2018-10-07
        • 1970-01-01
        • 2017-12-12
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多