Как передать столбец dataframe в качестве аргумента в функцию, используя трубопровод? - PullRequest
3 голосов
/ 16 января 2020

Я возиться со встроенным набором данных economics в R, и я пытаюсь передать столбец dataframe в качестве аргумента в функцию, которая использует трубопровод ( 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: трудно -код pop и number в пользовательской функции:

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: Вывод:

Теперь вывод такой же, как в первом примере. Обе переменные, по-видимому, игнорируются.

Итак, есть предложения?

1 Ответ

5 голосов
/ 16 января 2020

Мы можем использовать нестандартную оценку с фигурными ({{}})

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')
...