【发布时间】:2019-07-18 13:56:39
【问题描述】:
我正在寻找替换我的一些使用 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"))
【问题讨论】:
-
我也遇到过这种事情。一种选择是切换到
group_nest()之类的东西。由于split()命名输出列表,您可以使用它来代替group_split()。一个简单的例子:dat %>% split(.$strat) %>% map_df(~data.frame(X = mean(.x$var) ), .id = "strat")