我有一些数据,其中一些被复制,一些没有。我只能适应 我的复制数据模型。
library(tidyverse)
d <- tribble(
~env, ~val,
"A", 1,
"A", 2,
"B", 3
)
我正在使用 tidyr::nest()
和 purrr::map()
函数来适应我的模型。
然而,在我用于 map()
的每个函数中,我都必须满足特殊的需求
我归档的一组特定数据不可建模的情况
通过以下方式的调用
map(col, function(elem){ if(!is.null(elem)) DO_STUFF(elem) else NULL})
过了一段时间,我成功地将这种行为提取为 purrr 风格的副词
函数接受另一个函数并将其包装,以便此行为
对于 NULL
元素是自动的:
maybe <- function(fun){
function(val,...){ if(!is.null(val)) fun(val, ...) else NULL}
}
然而,这让我想知道:我是否在重复这样的行为 已经可以使用 tidyverse 函数存档?
额外问题:函数式编程中是否有一个词来表示像 maybe
这样的函数?
这是测试我的副词的示例:
简单模型:环境 A 中的数据的平均值,并且没有环境 A 中的数据的模型 环境B(因为数据是未复制的:)
modelFuns <- list(A = mean, B = NULL)
按环境对数据进行分组,并为每个组确定适当的模型
d <- d %>% group_by(env) %>% nest(.key = "data")
d %<>% mutate(model = modelFuns[env])
d
## # A tibble: 2 x 3
## env data model
## <chr> <list> <list>
## 1 A <tibble [2 × 1]> <fn>
## 2 B <tibble [1 × 1]> <NULL>
执行建模:
d %<>% mutate(out = pmap(list(model, data), maybe(function(m,d) m(d$val))))
d
## # A tibble: 2 x 4
## env data model out
## <chr> <list> <list> <list>
## 1 A <tibble [2 × 1]> <fn> <dbl [1]>
## 2 B <tibble [1 × 1]> <NULL> <NULL>
这相当于以下不使用我的maybe
副词的代码:
d %<>% mutate(out = pmap(list(model, data), function(m,d){if(!is.null(m)) m(d$val) else NULL}))
d
## # A tibble: 2 x 4
## env data model out
## <chr> <list> <list> <list>
## 1 A <tibble [2 × 1]> <fn> <dbl [1]>
## 2 B <tibble [1 × 1]> <NULL> <NULL>
可能有一个值或可能有 NULL
的事实传播到
我想要对下游建模结果做的一切,即
为什么副词maybe
很有用。这样的东西已经存在了吗
在 tidyverse 中?
isModelNice <- function(val) val > 0
d %<>% mutate(nice = map(out, maybe(isModelNice)))
d
## # A tibble: 2 x 5
## env data model out nice
## <chr> <list> <list> <list> <list>
## 1 A <tibble [2 × 1]> <fn> <dbl [1]> <lgl [1]>
## 2 B <tibble [1 × 1]> <NULL> <NULL> <NULL>
最佳答案
你可以使用purrr::possible()
吗?
library(tidyverse)
d <- tribble(
~env, ~val,
"A", 1,
"A", 2,
"B", 3
)
modelFuns <- list(A = mean, B = NULL)
d %>% group_by(env) %>%
nest(.key = "data") %>%
mutate(model = modelFuns[env]) %>%
mutate(out = pmap(list(model, data), possibly(function(m,d) m(d$val), NULL)))
关于r - 有没有办法在 purrr::map 中自动传播 NULL?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/50058090/