gpt4 book ai didi

如果 purrr :possibly() fails 内的表达式返回映射对象

转载 作者:行者123 更新时间:2023-12-03 07:40:13 25 4
gpt4 key购买 nike

我有一个数据框,其中一列包含更多数据框。其中一个数据框缺少一列。我想从其他两个数据框中删除该列(如果存在)。

这是一个例子:

library(tidyverse)

mtcars %>%
group_by(cyl) %>%
nest -> tmp
tmp[3,'data'][[1]][[1]] <- dplyr::select(tmp[3,'data'][[1]][[1]], -mpg)

print(tmp)
# A tibble: 3 x 2
cyl data
<dbl> <list>
1 6. <tibble [7 × 10]>
2 4. <tibble [11 × 10]>
3 8. <tibble [14 × 9]>

因此,data 列包含三个小标题,其中最后一个不包含 mpg 列。我可以将 dplyr::select 映射到数据列上,并通过返回 NA 来捕获错误,如下所示:

 tmp %>% mutate(data2 = map(data, possibly(~dplyr::select(.,-mpg), otherwise = NA)))
# A tibble: 3 x 3
cyl data data2
<dbl> <list> <list>
1 6. <tibble [7 × 10]> <tibble [7 × 9]>
2 4. <tibble [11 × 10]> <tibble [11 × 9]>
3 8. <tibble [14 × 9]> <lgl [1]>

但我真正愿意做的是返回输入数据。像这样的东西:

 tmp %>% mutate(data2 = map(data, possibly(~dplyr::select(.,-mpg), otherwise = function(x){x})))
# A tibble: 3 x 3
cyl data data2
<dbl> <list> <list>
1 6. <tibble [7 × 10]> <tibble [7 × 9]>
2 4. <tibble [11 × 10]> <tibble [11 × 9]>
3 8. <tibble [14 × 9]> <fn>

当然,这只会返回 function(x){x} 作为 data2 的最后一行。

有什么好主意吗?或者在这种情况下我只需要使用 tryCatch 或以其他方式更明确地处理错误?

最佳答案

可能中的otherwise参数是一个常量,所以它不会随着包装函数的输入而改变;你可能做的是将 可能 包装在另一个可以从 data 访问元素的函数中,将元素设置为 otherwise:

my_select <- function(x) {
f = possibly(function() select(x, -mpg), otherwise = x)
f()
}

tmp %>% mutate(data2 = map(data, my_select))
# A tibble: 3 x 3
# cyl data data2
# <dbl> <list> <list>
#1 6.00 <tibble [7 x 10]> <tibble [7 x 9]>
#2 4.00 <tibble [11 x 10]> <tibble [11 x 9]>
#3 8.00 <tibble [14 x 9]> <tibble [14 x 9]>

或者采用公式形式:

tmp %>% 
mutate(data2 = map(data, ~ (invoke(possibly(function() select(.,-mpg), otherwise = .)))))

# A tibble: 3 x 3
# cyl data data2
# <dbl> <list> <list>
#1 6 <tibble [7 × 10]> <tibble [7 × 9]>
#2 4 <tibble [11 × 10]> <tibble [11 × 9]>
#3 8 <tibble [14 × 9]> <tibble [14 × 9]>

关于如果 purrr :possibly() fails 内的表达式返回映射对象,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/50341012/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com