tidyr:在函数内部使用 mutate
tidyr: using mutate inside a function
我想使用 tidyverse 中的 mutate 函数基于旧列创建一个新列,仅使用数据框和表示列 headers 的字符串作为输入。
我可以在不使用 tidyverse 的情况下让它工作(参见下面的函数 f),但我想使用 tidyverse 让它工作(参见下面的函数 f.tidy)
有人可以 post 使用从内部函数调用的 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
我们可以使用 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
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
我想使用 tidyverse 中的 mutate 函数基于旧列创建一个新列,仅使用数据框和表示列 headers 的字符串作为输入。
我可以在不使用 tidyverse 的情况下让它工作(参见下面的函数 f),但我想使用 tidyverse 让它工作(参见下面的函数 f.tidy)
有人可以 post 使用从内部函数调用的 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
我们可以使用 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
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