Создание имен переменных в select

Я пытаюсь написать функцию, которая (частично) переименует переменную, объединив ее исходный фрейм данных и существующее имя переменной. В сущности, я хочу:

df1 <- data.frame(a = 1, b = 2)

стать:

df1 %>%
  rename(df1_a = a)

#  df1_a b
#1     1 2

но я хочу сделать это программно, что-то вроде:

fun <- function(df, var) {
  outdf <- rename_(df, paste(df, var, sep = "_") = var)
  return(outdf)
}

этот, по общему признанию, наивный подход, очевидно, не работает, но я не смог понять это. Я уверен, что ответ где-то в nse виньетка (https://cran.r-project.org/web/packages/dplyr/vignettes/nse.html), но это, похоже, не связано с построением имен переменных.

2 ответов


Не уверен, что это правильный путь dplyr-esque, но это заставит вас идти.

fun <- function(df, var) {
    x <- deparse(substitute(df))
    y <- deparse(substitute(var))
    rename_(df, .dots = with(df, setNames(as.list(y), paste(x, y, sep = "_"))))
}

fun(df1, a)
#   df1_a b
# 1     1 2

fun(df1, b)
#   a df1_b
# 1 1     2

lazyeval здесь действительно не нужен, потому что известна среда обоих входов. Что говорится:

library(lazyeval)
library(dplyr)
library(magrittr)

fun = function(df, var) {
  df_ = lazy(df)
  var_ = lazy(var)
  fun_(df_, var_)
}

fun_ = function(df_, var_) {

  new_var_string = 
    paste(df_ %>% as.character %>% extract(1),
          var_ %>% as.character %>% extract(1), 
          sep = "_")

  dots = list(var_) %>% setNames(new_var_string)

  df_ %>%
    lazy_eval %>%
    rename_(.dots = dots)
}

fun(df1, a)