我有一個 csv,它為每個變數定義一行(指的是在另一個資料集中定義的真實資料變數)。輕輕按摩后,我有一個命名向量,如fxs.
然后我可以迭代變數,并執行適當的函式。還有另一種方法我應該考慮嗎?也許與rlang::exec()和/或purrr::map_*()。我喜歡我可以用單獨的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
uj5u.com熱心網友回復:
我們可以使用cur_column()子集內的運算式across
library(dplyr)
d %>%
mutate(across(all_of(names(fxs)),
~ eval(parse(text = fxs[[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 %>%
mutate(across(all_of(names(fxs)),
~ exec(rlang::parse_expr(fxs[[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
如果函式都在做乘法,而是創建一個命名的vector或list要相乘的值,并避免eval/parse
nm1 <- c(Sepal.Length = 1, Sepal.Width = 10, Petal.Length = 100)
d %>%
mutate(across(all_of(names(nm1)), ~ nm1[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
轉載請註明出處,本文鏈接:https://www.uj5u.com/houduan/368680.html
上一篇:Mysql范圍檢查而不是索引使用
