web-dev-qa-db-ja.com

動的な名前とdplyrを使用して変数の名前を変更する方法

関数内の列の名前を、この関数の引数として渡された名前に変更したい。基本的に、私は機能を持っています

produce_data_frame <- function(name) {
  return(iris)
}

そして、私はこの関数がSepal.length列の名前を 'name'に変更することを望んでいます(nameはnameの値を取ります)次のような別のことを試しました

produce_data_frame <- function(name) {
  name <- enquo(name)
  iris %>%
    rename((!!name) = Sepal.Length) %>%
    return()
}

そして電話するとき

produce_data_frame("newName")

NewNameという名前のSepal.Length列を持つiris data.frameを取得したいと思います。しかし、NSEに対する私の理解はまだ非常に基本的であり、コンパイルすらできません。

11
Malta

あなたが試すことができます

library(tidyverse)

produce_data_frame <- function(name) {
  iris %>%
    as.tibble() %>% 
    select(!!quo_name(name) := Sepal.Length)
}

produce_data_frame("new_name")
#> # A tibble: 150 x 1
#>    new_name
#>       <dbl>
#>  1     5.10
#>  2     4.90
#>  3     4.70
#>  4     4.60
#>  5     5.00
#>  6     5.40
#>  7     4.60
#>  8     5.00
#>  9     4.40
#> 10     4.90
#> # ... with 140 more rows

reprexパッケージ (v0.2.0)によって2018-04-04に作成されました。

14
Roman

異なる入力変数と出力変数Programming with dplyrビネットの場合、:=演算子:

library(dplyr)
library(rlang)


produce_data_frame <- function(name) {
  name = quo_name(name)
  iris %>%
    rename(!!name := Sepal.Length)
}

produce_data_frame('test') %>% colnames()
#> [1] "test"         "Sepal.Width"  "Petal.Length" "Petal.Width" 
#> [5] "Species"
5
GGamba

代わりにベースR names()を使用できます。

produce_data_frame <- function(name) {
  temp_df <- iris
  names(temp_df)[names(temp_df) == "Sepal.Length"] <- name
  return(temp_df)
}

produce_data_frame("newName")
#        newName Sepal.Width Petal.Length Petal.Width    Species
#1           5.1         3.5          1.4         0.2     setosa
#2           4.9         3.0          1.4         0.2     setosa
4
Shique