【问题标题】:How to pass a dataframe column as an argument in a function using piping?如何使用管道将数据框列作为参数传递给函数?
【发布时间】:2020-05-03 04:26:19
【问题描述】:

我在搞乱 R 中的内置数据集 economics,我试图将数据框列作为参数传递给使用管道的函数(dplyr%>%)。但我遇到了一些看似奇怪的问题。不知何故,我无法成功地将列名作为参数传递给自定义函数中的函数top_n()。以下是我如何在没有自定义函数的情况下对人口最多的 5 个国家进行子集:

代码 1:

library(dplyr)

df_econ <- economics
df_top_5 <- df_econ %>% top_n(5, pop)
df_top_5

输出 1:

2014-12-01  12122.0 320201  5.0 12.6    8688
2015-01-01  12080.8 320367  5.5 13.4    8979
2015-02-01  12095.9 320534  5.7 13.1    8705
2015-03-01  12161.5 320707  5.2 12.2    8575
2015-04-01  12158.9 320887  5.6 11.7    8549

包装成一个自定义函数,它可能看起来像这样:

代码 2:

library(dplyr)

# data
data(economics)
df_econ <- economics

# custom function
fxtop <- function(df, number, column){

  tops <- df %>% top_n(number, column)
  return(tops)
}

# build a df using custom function
df_top_5 <- fxtop(df=df_econ, number=5, column='pop')
df_top_5

输出 2:

1967-07-01  507.4   198712  12.5    4.5 2944
1967-08-01  510.5   198911  12.5    4.7 2945
1967-09-01  516.3   199113  11.7    4.6 2958
1967-10-01  512.9   199311  12.5    4.9 3143
1967-11-01  518.1   199498  12.5    4.7 3066
1967-12-01  525.8   199657  12.1    4.8 3018
1968-01-01  531.5   199808  11.7    5.1 2878
1968-02-01  534.2   199920  12.2    4.5 3001
1968-03-01  544.9   200056  11.6    4.1 2877
1968-04-01  544.6   200208  12.2    4.6 2709

此输出有 10 行,而不是预期的 5 行。我怀疑参数number=5 只是被忽略了,实际使用的数字默认为10。数据似乎也没有按'pop' 排序。

到目前为止我所做的尝试:

尝试 1: 在自定义函数中硬编码 popnumber

library(dplyr)

# data
data(economics)
df_econ <- economics

# custom function
fxtop <- function(df, number, column){

  tops <- df %>% top_n(5, pop)
  return(tops)
}

# build a df using custom function
df_top_5 <- fxtop(df=df_econ, number=5, column='pop')
df_top_5

尝试 1:输出:

2014-12-01  12122.0 320201  5.0 12.6    8688
2015-01-01  12080.8 320367  5.5 13.4    8979
2015-02-01  12095.9 320534  5.7 13.1    8705
2015-03-01  12161.5 320707  5.2 12.2    8575
2015-04-01  12158.9 320887  5.6 11.7    8549

尝试1:评论

这是想要的输出!

让我们看看当我通过函数传递变量时会发生什么

尝试 2: 将变量作为对象而不是字符串传递:

library(dplyr)

# data
data(economics)
df_econ <- economics

# custom function
fxtop <- function(df, number, column){

  tops <- df %>% top_n(5, column)
  return(tops)
}

# build a df using custom function
df_top_5 <- fxtop(df=df_econ, number=5, column='pop')
df_top_5

尝试 2:输出:

现在输出与第一个示例相同。这两个变量似乎都被忽略了。

那么,有什么建议吗?

【问题讨论】:

    标签: r dplyr pipe


    【解决方案1】:

    我们可以通过 curly-curly ({{}}) 使用非标准评估

    library(dplyr)
    library(rlang)
    
    fxtop <- function(df, number, column){
       tops <- df %>% top_n(number, {{column}})
       return(tops)
    }
    

    并传递不带引号的变量名

    fxtop(df=df_econ, number=5, pop)
    
    #   date        pce     pop psavert uempmed unemploy
    #  <date>      <dbl>   <dbl>   <dbl>   <dbl>    <dbl>
    #1 2014-12-01 12062  319746.     7.6    12.9     8717
    #2 2015-01-01 12046  319929.     7.7    13.2     8903
    #3 2015-02-01 12082. 320075.     7.9    12.9     8610
    #4 2015-03-01 12158. 320231.     7.4    12       8504
    #5 2015-04-01 12194. 320402.     7.6    11.5     8526
    

    如果您想将列名作为字符串(带引号)传递,我们可以使用sym!!

    fxtop <- function(df, number, column){
      tops <- df %>% top_n(number, !!sym(column))
      return(tops)
    }
    fxtop(df=df_econ, number=5, 'pop')
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2019-07-23
      • 1970-01-01
      • 2023-03-28
      • 2019-08-21
      • 2013-01-27
      • 2020-12-26
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多