tidyr:在函数中使用mutate

时间:2018-03-30 14:29:21

标签: r tidyr tidyverse

我想使用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

1 个答案:

答案 0 :(得分:4)

我们可以使用=COUNTIFS(A:A,1,INDIRECT("'" & D5&"'!D:D"),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_at

rename_at