1

いくつかのベクトルとデータフレームがあるとします:

a <- c(1, 2, 0, 1)
b <- c(6, 4)
df1 <- data_frame(x = c(6, 8, 12), y = c(24, 18, 16))

データフレームの列の平均とベクトルの平均を計算する非標準評価を使用して関数を作成します。

calculate_means <- function(df, column, vector) {
  column <- enquo(column)
  summarise(df, mean_column = mean(!!column), mean_vector = mean(vector))
}

calculate_means(df1, x, a)
# A tibble: 1 x 2
  mean_column mean_vector
        <dbl>       <dbl>
1        8.67        1.00

calculate_means(df1, y, b)
# A tibble: 1 x 2
  mean_column mean_vector
        <dbl>       <dbl>
1        19.3        5.00

それは期待どおりに機能します。しかし、同じ関数を記述して、パラメーターに別の名前を選択するとどうなるでしょうか?

calculate_means <- function(df, x, y) {
  x <- enquo(x)
  summarise(df, mean_column = mean(!!x), mean_vector = mean(y))
}

calculate_means(df1, x, a)
# A tibble: 1 x 2
  mean_column mean_vector
        <dbl>       <dbl>
1        8.67        19.3

calculate_means(df1, y, b)
# A tibble: 1 x 2
  mean_column mean_vector
        <dbl>       <dbl>
1        19.3        19.3

最初のパラメーターは以前と同じように評価されますが、2 番目のパラメーターは常にデータフレームの列 "y" を評価しています。ベクトル「a」と「b」をそれぞれ評価するべきではありませんか?

4

2 に答える 2

0

globalenv()オブジェクトのリストを取得し、オブジェクト名を文字列として渡してオブジェクトの値を取得し、それをsummariseステートメントで使用するために使用できます

calculate_means <- function(df, x, y) {
  x <- enquo(x)
  y <- quo_name(enquo(y))
  v1 <- globalenv()[[y]]

  df %>%
       summarise(mean_column = mean(!! x),
       mean_vector = mean(v1))
 }

calculate_means(df1, x, a)
# A tibble: 1 x 2
#   mean_column mean_vector
#        <dbl>       <dbl>
#1        8.67        1.00

calculate_means(df1, y, b)
# A tibble: 1 x 2
#   mean_column mean_vector
#        <dbl>       <dbl>
#1        19.3        5.00

mean「y」列も取得する必要があるとします。

calculate_means <- function(df, x, y) {
  x <- enquo(x)
  y <- quo_name(enquo(y))
  v1 <- globalenv()[[y]]

  df %>%
       summarise(mean_column = mean(!! x),
       mean_vector = mean(v1),
       mean_column2 = mean(.data$y))
 }

calculate_means(df1, x, a)
# A tibble: 1 x 3
#  mean_column mean_vector mean_column2
#        <dbl>       <dbl>        <dbl>
#1        8.67        1.00         19.3
于 2018-02-21T12:08:06.610 に答える