我试图使用purrr包的pmap函数循环遍历tibble的不同列。每一列包含某些模型参数(例如样本大小、系数等),我希望将它们用作我的函数的输入。每一行属于一个模拟模型。
因此,我想直接告诉pmap要引用哪些列作为参数 ..1, ..2等的名称,但我遇到了困难。
例如,以下代码将生成三个均匀分布,其中每一行定义分布的样本大小、最小和最大值。
上面的代码运行正常。然而,似乎在pmap函数的第一部分明确指定..1 = n, ..2 = min等参数没有作用。相反,参数..1、..2和..3似乎是指数据框中实际列的位置。省略那个第一部分会产生相同的结果。
使用多个数据帧或变换顺序的大量列时,很容易出现问题,比如混淆参数的顺序。因此我的问题是:是否可以通过列名而不是在数据框中的位置,显式地将 pmap 使用的 ..1, ..2, ..3, ... 参数分配给某一列?
因此,我想直接告诉pmap要引用哪些列作为参数 ..1, ..2等的名称,但我遇到了困难。
例如,以下代码将生成三个均匀分布,其中每一行定义分布的样本大小、最小和最大值。
set.seed(2022)
test <- tibble(n = c(10, 20, 30),
min = c(0, 100, 500),
max = c(100, 500, 1000))
test %>% pmap(..1 = n, ..2 = min, ..3 = max, ~runif(n = ..1, min = ..2, max = ..3) %>% round(digits = 0))
上面的代码运行正常。然而,似乎在pmap函数的第一部分明确指定..1 = n, ..2 = min等参数没有作用。相反,参数..1、..2和..3似乎是指数据框中实际列的位置。省略那个第一部分会产生相同的结果。
set.seed(2022)
test %>% pmap(~runif(n = ..1, min = ..2, max = ..3) %>% round(digits = 0))
如果数据框架有很多列或列的顺序发生变化,那么这将成为一个问题并容易出错。 例如,对于具有两个额外列的相同df(test2),上面的代码将抛出错误,因为第二列现已被替换为字符列,并且另外第一列和第三列也现在指代不同的内容。
test2 <- tibble(model = (1:3),
type_dist= rep("uniform", 3),
n = c(10, 20, 30),
min = c(0, 100, 500),
max = c(100, 500, 1000))
set.seed(2022)
test2 %>% pmap(..1 = n, ..2 = min, ..3 = max, ~runif(n = ..1, min = ..2, max = ..3) %>% round(digits = 0))
运行runif(n = ..1, min = ..2, max = ..3)时发生错误:参数无效
即使我尝试将..1、..2和..3明确分配给列名也没有用。 相反,我必须确保现在引用的是第三到第五列。
set.seed(2022)
test2 %>% pmap(~runif(n = ..3, min = ..4, max = ..5) %>% round(digits = 0))
使用多个数据帧或变换顺序的大量列时,很容易出现问题,比如混淆参数的顺序。因此我的问题是:是否可以通过列名而不是在数据框中的位置,显式地将 pmap 使用的 ..1, ..2, ..3, ... 参数分配给某一列?
args2 <- list(n = test$n, min = test$min, max = test$max) pmap(args2, ~with(list(...),runif(n, min, max)))
这样的代码是否合适? - Maël