r-将特定函数动态应用于不同的变量



我有一个csv,它为每个变量定义一行(指在另一个数据集中定义的真实数据变量(。经过光按摩后,我得到了一个命名的向量,像fxs

然后,我可以对变量进行迭代,并执行适当的函数。我还有别的办法可以考虑吗?可能与CCD_ 2和/或CCD_。我喜欢我可以用单独的tryCatch()块来包装这两条主线,以便更准确地描述解析函数时出错,或者执行函数时出错。

fxs <- c(
"Sepal.Length"   = "\(x) x *   1",
"Sepal.Width"    = "\(x) x *  10",
"Petal.Length"   = "\(x) x * 100"
)
d <- iris[1:5, 1:3]
for (variable in colnames(d)) {
fx <- base::eval(base::parse(text = fxs[[variable]]))
d[[variable]] <- fx(d[[variable]])
}
d

我觉得它看起来很像dplyr::mutate()语句的内部。也许最好尝试将csv转换为传递给...的语句。除了这个概念验证之外,我还没有做任何事情,所以如果有人有不同的方法,我会有很大的灵活性。

d |> 
dplyr::mutate(
Sepal.Length   = Sepal.Length *   1,
Sepal.Width    = Sepal.Width  *  10,
Petal.Length   = Petal.Length * 100,
)

期望输出:

Sepal.Length Sepal.Width Petal.Length
1          5.1          35          140
2          4.9          30          140
3          4.7          32          130
4          4.6          31          150
5          5.0          36          140

我们可以使用cur_column()across中对表达式进行子集设置

library(dplyr)
d %>% 
dplyr::mutate(
dplyr::across(
.cols = dplyr::all_of(names(fxs)), 
.fns  = ~ eval(parse(text = fxs[[dplyr::cur_column()]]))(.x)
)
)

-输出

Sepal.Length Sepal.Width Petal.Length
1          5.1          35          140
2          4.9          30          140
3          4.7          32          130
4          4.6          31          150
5          5.0          36          140

或使用exec

library(purrr)
d %>% 
dplyr::mutate(
dplyr::across(
.cols = dplyr::all_of(names(fxs)), 
.fns  = ~ rlang::exec(
rlang::parse_expr(fxs[[dplyr::cur_column()]]), 
.x
)
)
)

如果函数都在进行乘法运算,则创建要相乘的值的命名vectorlist,并避免eval/parse

nm1 <- c(Sepal.Length = 1, Sepal.Width = 10, Petal.Length = 100)
d %>% 
dplyr::mutate(
dplyr::across(
.cols = dplyr::all_of(names(nm1)),
.fns  = ~ nm1[dplyr::cur_column()] * .x
)
)

最新更新