gpt4 book ai didi

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

转载 作者:行者123 更新时间:2023-12-01 11:13:09 31 4
gpt4 key购买 nike

我正在寻找替换我的一些使用 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/

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