r - 如何编写依赖于常数的动态方程
问题描述
我正在尝试编写一个取决于常数(级别数)的方程式。如下所示,如果我有 2 个级别,if 语句将引用 L1 和 L2。
问题:
- 如何修改代码以反映 x 个级别?x 可以是任何整数(通常是 2-12)。
- 如何在没有 for 循环的情况下重写代码?
非常感谢你的帮助!
例如(对于 2 个级别):
查找表
L1_var <- c("Price", "Price", "Price", "Price")
L1_val <- c("AO", "AO", "Premium", "Premium")
L2_var <- c("Type", "Type", "Form", "Form")
L2_val <- c("Diet", "Regular", "Bottle", "Can")
tbl <- data.frame(L1_var, L1_val, L2_var, L2_val)
数据集
Price <- c("Premium", "AO", "AO")
Type <- c("Diet", "Regular", "Diet")
Form <- c("Bottle", "Bottle", "Can")
df <- data.frame(Price, Type, Form)
对于 num_level = 2
for (i in 1:nrow(df)) {
for (j in 1:nrow(tbl)) {
if (df[i, tbl$L1_var[j]] == tbl$L1_val[j] &
df[i, tbl$L2_var[j]] == tbl$L2_val[j]) {
df[i, "L1"] <- paste0(tbl$L1_var[j], ": ", tbl$L1_val[j])
df[i, "L2"] <- paste0(tbl$L2_var[j], ": ", tbl$L2_val[j])
}
}
}
如果我在 df 中有 3 个级别,我希望代码为:
for (i in 1:nrow(df)) {
for (j in 1:nrow(tbl)) {
if (df[i, tbl$L1_var[j]] == tbl$L1_val[j] &
df[i, tbl$L2_var[j]] == tbl$L2_val[j] &
df[i, tbl$L3_var[j]] == tbl$L3_val[j] ) {
df[i, "L1"] <- paste0(tbl$L1_var[j], ": ", tbl$L1_val[j])
df[i, "L2"] <- paste0(tbl$L2_var[j], ": ", tbl$L2_val[j])
df[i, "L3"] <- paste0(tbl$L3_var[j], ": ", tbl$L3_val[j])
}
}
}
解决方案
这是我解决问题的方法,大量使用purrr
and dplyr
。它应该适用于任何数量的变量tbl
:
library(purrr)
library(dplyr)
tbl %>%
pmap(function(...) {
args <- c(...)
vars <- args[seq(1, length(args), 2)] %>%
set_names(NULL)
values <- args[seq(2, length(args), 2)] %>%
set_names(vars)
df %>%
filter(across(vars, ~ . == values[cur_column()])) %>%
mutate(across(.cols = vars,
.fns = ~ sprintf("%s: %s", cur_column(), .),
.names = "L{which(vars ==.col)}"))
}) %>%
bind_rows()
推荐阅读
- python - 在 Python 中打印函数和调用函数有什么区别?
- c++ - 为什么 keybd_event 不能与“Shift Key”一起正常工作?
- next.js - 无法在 Vercel 上使用 serverSideTranslations
- python - 如何从数据框中提取特定值的索引和列?
- javascript - 如何避免 Jshint(在引用外部范围变量的循环中声明的函数可能会导致语义混淆)
- javascript - 将 Handlebars 与 Node.js/Express 一起使用,需要登录和注销才能根据用户登录进行渲染
- kotlin - Jetbrains Compose 的 Kotlin 内部错误 java.lang.IllegalStateException
- java - 通过 Java 文件使用 Avro Schema 别名
- javascript - Gsap 和 ReactJs。它可以工作/编译,但我有一个控制台错误。“未捕获的 TypeError:callback.call 不是函数”
- xamarin.forms - Xamarin Forms 数字键盘 - 启用空格和破折号按钮