【发布时间】:2022-01-21 09:31:29
【问题描述】:
假设我有一个包含多个列的数据框,其中一些我想要转换。列名定义了需要使用的转换。
library(tidyverse)
set.seed(42)
df <- data.frame(A = 1:100, B = runif(n = 100, 0, 1), log10 = runif(n = 100, 10, 100), log2 = runif(n = 100, 10, 100), log1p = runif(n = 100, 10, 100), sqrt = runif(n = 100, 10, 100))
trans <- list()
trans$log10 <- log10
trans$log2 <- log2
trans$log1p <- log1p
trans$sqrt <- sqrt
理想情况下,我想使用 across 调用,其中列名与 trans 函数名匹配,并且转换将即时执行。
所需的输出如下:
df_trans <- df %>%
dplyr::mutate(log10 = trans$log10(log10),
log2 = trans$log2(log2),
log1p = trans$log1p(log1p),
sqrt = trans$sqrt(sqrt))
df_trans
但是,我不想单独手动指定每个转换。在代表性示例中,我只有 4 个,但这个数字可能会有所不同,而且会显着增加,这使得手动规范变得繁琐且容易出错。
我已设法通过将 trans 列表转换为数据框并左连接来将列名与函数匹配,但随后无法调用 trans_function 列中的函数。
trans_df <- enframe(trans, value = "trans_function")
df %>%
pivot_longer(cols = everything()) %>%
left_join(trans_df) %>%
dplyr::mutate(value = trans_function(value))
错误:
mutate()列value出现问题。
我value = trans_function(value).
x 找不到函数“trans_function”
我想我要么需要找到一种从列表列中调用函数的方法,要么需要找到另一种将函数名与列名匹配的方法。欢迎所有想法。
【问题讨论】: