R 在select中构造变量名_

R 在select中构造变量名_,r,dplyr,R,Dplyr,我正在尝试编写一个函数,该函数将(部分)通过组合其源数据帧和现有变量名来重命名变量。本质上,我希望: df1 <- data.frame(a = 1, b = 2) 但我想通过编程来实现这一点,大致如下: fun <- function(df, var) { outdf <- rename_(df, paste(df, var, sep = "_") = var) return(outdf) } fun不确定这是否是dplyr风格的正确方式,但它会让你继续 fun

我正在尝试编写一个函数,该函数将(部分)通过组合其源数据帧和现有变量名来重命名变量。本质上,我希望:

df1 <- data.frame(a = 1, b = 2)
但我想通过编程来实现这一点,大致如下:

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

fun不确定这是否是dplyr风格的正确方式,但它会让你继续

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

funlazyeval在这里并不真正需要,因为两个输入的环境都是已知的。也就是说:

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)

对于
df1
,您只希望新名称为
df_a
,而不是
df1_a
?对不起,输入错误-应该是df1_a作为交叉参考,这建立在以下地址的答案和讨论基础上:在BaserLand,您可以做到:
有趣是的,到目前为止,在这种情况下,基R似乎会更容易,因为这一个对于多个列来说变得更复杂。当然,你们都是正确的-这是我无法解决的问题之一,我无法放手。。。
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)