ohn*_*lus 3 error-handling r purrr
我有一个数据框,其中一列包含更多数据框。其中一个数据框缺少一列。我想从其他两个数据框中删除该列(如果存在)。
\n\n这是一个例子:
\n\nlibrary(tidyverse)\n\nmtcars %>%\ngroup_by(cyl) %>%\nnest -> tmp\ntmp[3,'data'][[1]][[1]] <- dplyr::select(tmp[3,'data'][[1]][[1]], -mpg)\n\nprint(tmp)\nRun Code Online (Sandbox Code Playgroud)\n\n\n\n\nRun Code Online (Sandbox Code Playgroud)\n# A tibble: 3 x 2\n cyl data \n <dbl> <list> \n1 6. <tibble [7 \xc3\x97 10]> \n2 4. <tibble [11 \xc3\x97 10]>\n3 8. <tibble [14 \xc3\x97 9]>\n
因此,在这里,该data列包含三个小标题,其中最后一个不包含该列mpg。我可以在数据列上映射 dplyr::select ,并通过返回捕获错误NA如下所示:
tmp %>% mutate(data2 = map(data, possibly(~dplyr::select(.,-mpg), otherwise = NA)))\nRun Code Online (Sandbox Code Playgroud)\n\n\n\n\nRun Code Online (Sandbox Code Playgroud)\n# A tibble: 3 x 3\n cyl data data2 \n <dbl> <list> <list> \n1 6. <tibble [7 \xc3\x97 10]> <tibble [7 \xc3\x97 9]> \n2 4. <tibble [11 \xc3\x97 10]> <tibble [11 \xc3\x97 9]>\n3 8. <tibble [14 \xc3\x97 9]> <lgl [1]>\n
但我真正想做的是返回输入数据。就像是:
\n\n tmp %>% mutate(data2 = map(data, possibly(~dplyr::select(.,-mpg), otherwise = function(x){x})))\nRun Code Online (Sandbox Code Playgroud)\n\n\n\n\nRun Code Online (Sandbox Code Playgroud)\n# A tibble: 3 x 3\n cyl data data2 \n <dbl> <list> <list> \n1 6. <tibble [7 \xc3\x97 10]> <tibble [7 \xc3\x97 9]> \n2 4. <tibble [11 \xc3\x97 10]> <tibble [11 \xc3\x97 9]>\n3 8. <tibble [14 \xc3\x97 9]> <fn>\n
但当然,这只是function(x){x}作为 的最后一行返回data2。
有什么巧妙的想法吗?或者在这种情况下我只需要tryCatch更明确地使用或以其他方式处理错误?
otherwisein 中的参数是possibly一个常量,因此它不会随着被包装函数的输入而改变;您可能要做的就是包装possibly另一个可以访问元素的函数data,将元素设置为otherwise:
my_select <- function(x) {\n f = possibly(function() select(x, -mpg), otherwise = x)\n f()\n}\n\ntmp %>% mutate(data2 = map(data, my_select))\n# A tibble: 3 x 3\n# cyl data data2 \n# <dbl> <list> <list> \n#1 6.00 <tibble [7 x 10]> <tibble [7 x 9]> \n#2 4.00 <tibble [11 x 10]> <tibble [11 x 9]>\n#3 8.00 <tibble [14 x 9]> <tibble [14 x 9]>\nRun Code Online (Sandbox Code Playgroud)\n\n或者采用公式形式:
\n\ntmp %>% \n mutate(data2 = map(data, ~ (invoke(possibly(function() select(.,-mpg), otherwise = .)))))\n\n# A tibble: 3 x 3\n# cyl data data2 \n# <dbl> <list> <list> \n#1 6 <tibble [7 \xc3\x97 10]> <tibble [7 \xc3\x97 9]> \n#2 4 <tibble [11 \xc3\x97 10]> <tibble [11 \xc3\x97 9]>\n#3 8 <tibble [14 \xc3\x97 9]> <tibble [14 \xc3\x97 9]>\nRun Code Online (Sandbox Code Playgroud)\n