在select_中构造变量名

时间:2015-10-09 00:09:30

标签: r dplyr

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

CXX=g++
CXXFLAGS=-Wall -O3

all: DroneMap

clean:
    rm -rf DroneMap

成为:

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) } 插图(https://cran.r-project.org/web/packages/dplyr/vignettes/nse.html)的某处,但这似乎并不能解决构建变量名称的问题。

2 个答案:

答案 0 :(得分:8)

不确定这是否是正确的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

答案 1 :(得分:0)

这里并不真正需要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)