用 dplyr::group_split 和 purrr::map_df 替换 dplyr::do 函数

标签 r dplyr purrr

我正在寻找替换我的一些使用 dplyr::do 的 R 代码,因为这个函数很快就会被弃用。我的很多工作都需要创建分层 CDF 图。使用 dply:do 时,我分层的变量作为变量传递给结果数据框,然后我可以轻松地使用它进行绘图。

我有一个使用 dplyr::group_split 和 purrr::map_df 替换 dplyr::do 的解决方案。但是,我在 dplyr::group_split 中传递的变量未在结果数据框中命名。这使得绘制分层数据变得困难。如何确保我在 dlyr::group_split 中传递的变量在结果数据框中被命名?

这里是一些创建我需要用 dplyr::do 绘制的数据的代码:

library(dplyr)
library(purrr)
library(ggplot2)

# simulate data
dat <- tibble(
  strat = rep(letters[1:3], each = 33), 
  var   = rnorm(99, 0, 1))

# example 1 that works, but will be depricated 
test_dat_1 <- dat %>% 
  dplyr::select(strat, var) %>%
  dplyr::group_by(strat) %>%
  dplyr::do(data.frame(X = wtd.Ecdf(.[[2]])$x, 
                       Y = wtd.Ecdf(.[[2]])$ecdf*100))

# this is the target plot
p <- ggplot(test_dat_1, aes(X, Y, colour = strat))
p + geom_step()

这是使用新的 tidy 和 purrr 函数创建数据的解决方案,但它的局限性在于我要分层的变量没有在最终数据框中提供,这使得绘制分层数据变得很麻烦:

# replacement for 'do'
test_dat_2 <- dat %>%
  group_split(strat) %>%
  map_df(~wtd.Ecdf(.x$var),
         tibble::enframe(name = "X", value = "Y"))

最佳答案

假设wtd.Ecdf来自Hmisc,输出是一个namedlist,可以是使用 as_tibble 转换为两列数据集,使用 mutate

按照 do 解决方案修改“ecdf”列
library(dplyr)
library(purrr)
library(Hmisc)
library(ggplot2)
test_dat_2 <- dat %>% 
                 group_split(strat) %>% 
                 map_df(~ c(strat = first(.x$strat), wtd.Ecdf(.x$var)) %>% 
                              as_tibble %>%
                              mutate(ecdf = ecdf * 100)) %>%
                 rename_at(2:3, ~ c("X", "Y"))

现在,在绘图中使用它

p <- ggplot(test_dat_2, aes(X, Y, colour = strat))
p + geom_step()

-输出

enter image description here


也可以在嵌套ing

之后执行此操作
test_dat_3 <- dat %>%
                group_by(strat) %>%
                nest() %>% 
                mutate(out = map(data, ~ wtd.Ecdf(.x$var) %>% 
                          as_tibble)) %>% 
                select(-data) %>%
                unnest %>% 
                rename_at(2:3, ~c("X", "Y"))

关于用 dplyr::group_split 和 purrr::map_df 替换 dplyr::do 函数,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/57096247/

相关文章:

r - 在神经网络中的函数 a(i) 和 b(j) 之间进行插值

r - 获取 R 中预定义函数的解析树

r - 如何在 ggplot2 的 x 轴中使用月份名称

从长到宽 reshape 并创建具有二进制值的列

R 将 2 个矩阵转置为 tibbles 列表(对于嵌套 df)

r - 阻止 R 覆盖图形文件

r - 使用 tryCatch 在函数内自定义错误消息

r - 修复多个警告 "unknown column"

r - 如何直接在 purrr::accumulate2() 中编写自定义函数

r - 有没有更快的替代方法来计算 R 中 100,000 个短字符串的特殊字符?