【问题标题】:tidyr: using mutate inside a functiontidyr:在函数中使用 mutate
【发布时间】:2018-09-09 14:29:50
【问题描述】:

我想使用 tidyverse 中的 mutate 函数在旧列的基础上创建一个新列,仅使用数据框和表示列标题的字符串作为输入。

我可以在不使用 tidyverse 的情况下使其工作(参见下面的函数 f),但我想使用 tidyverse 让它工作(参见下面的函数 f.tidy)

有人可以发布使用从内部函数调用的 mutate 添加此列的解决方案吗?

df <- data.frame('test' = 1:3, 'tcy' = 4:6)
# test tcy
#    1   4
#    2   5
#    3   6  

f.tidy <- function(df, old.col, new.col) {
  df.rv <- df %>%
    mutate(new.col = .data$old.col + 1)
  return(df.rv)
}

f <- function(df, old.col, new.col) {
  df.rv <- df
  df.rv[, new.col] <- df.rv[, old.col] + 1
  return(df.rv)
}

old.col <- 'tcy'
new.col <- 'dan'

f.tidy(df = df, old.col = old.col, new.col = new.col)
# Evaluation error: Column 'old.col': not found in data
f(df = df, old.col = old.col, new.col = new.col)
# Produces Desired Output:
# test tcy dan
#    1   4   5
#    2   5   6
#    3   6   7

【问题讨论】:

标签: r tidyr tidyverse


【解决方案1】:

我们可以使用rlang 将其转换为符号,然后使用!! 进行评估

f.tidy <- function(df, old.col, new.col) {

  df %>%
      mutate(!! (new.col) := !!rlang::sym(old.col) + 1)

}

f.tidy(df = df, old.col = old.col, new.col = new.col)
#   test tcy dan
#1    1   4   5
#2    2   5   6
#3    3   6   7

或者另一个选项是mutate_atrename_at

f.tidy <- function(df, old.col, new.col) {

 df %>%
    mutate_at(vars(old.col),  funs(new = .+ 1)) %>%
    rename_at(vars(matches("new")), ~ new.col)

 }

f.tidy(df = df, old.col = old.col, new.col = new.col)
#   test tcy dan
#1    1   4   5
#2    2   5   6
#3    3   6   7

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2014-11-29
    • 2020-12-13
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多