【问题标题】:Construct variable names in select_在 select_ 中构造变量名
【发布时间】:2015-10-09 00:09:30
【问题描述】:

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

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) 中的某处,但这似乎并没有解决构造变量名的问题。

【问题讨论】:

标签: r dplyr


【解决方案1】:

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

【讨论】:

  • 在基础 R 领域,您可以这样做:fun &lt;- function(df,var) {names(df)[names(df) %in% var] &lt;- paste(deparse(substitute(df)),var,sep="_"); df} - 这也具有矢量化的优势。 - fun(df1, c("a","b"))
  • 是的,到目前为止,在这种情况下,base R 似乎会更容易,因为这对于多列变得更加复杂
  • 你当然是对的 - 这是我无法弄清楚并且无法放手的问题之一......
【解决方案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)

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2014-12-02
    • 2019-09-30
    • 1970-01-01
    • 2018-01-03
    • 1970-01-01
    • 2013-06-04
    • 1970-01-01
    • 2018-08-16
    相关资源
    最近更新 更多