我正在寻找替换我的一些使用 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
,输出是一个named
list
,可以是使用 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()
-输出
也可以在嵌套
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/