复制在dplyr中用Hmisc生成分位数的plyr解

问题描述 投票:0回答:1

我坚持如何开发dplyr解决方案,我经常在plyr做的事情。

这是'plyr'的例子:

# load packages
if(!require("pacman"))install.packages("pacman")
p_load(dplyr, plyr, Hmisc, tidyverse)

    # generate data
    df_samp <- tibble(
    x_var  = rnorm(100, 0, 1),
    levels = rep(c('a', 'b', 'c', 'd'), 25))

    # working plyr solution that groups data by level and calculates quantiles within levels
    plyr_solution <- plyr::ddply(df_samp,~ levels,
                                 summarise, X = wtd.Ecdf(x_var)$x, 
                                 Y = wtd.Ecdf(x_var)$ecdf)
    plyr_solution

    # dplyr attempt

    dplyr_solution <- df_samp %>% 
    dplyr::select(levels, x_var) %>%
    dplyr::group_by(levels) %>%
    dplyr::mutate(
      X = Hmisc::wtd.Ecdf(x_var)$x,
      Y = Hmisc::wtd.Ecdf(x_var)$ecdf
    )

欣赏有关如何调试当前'dplyr'尝试或完全使用dplyr的另一种方法的任何建议。

r dplyr plyr tidyr
1个回答
1
投票

怎么样(虽然也需要tidyr

dplyr_solution <- df_samp %>% 
  dplyr::select(levels, x_var) %>%
  dplyr::group_by(levels) %>%
  dplyr::do( X = wtd.Ecdf(.$x_var)$x, 
      Y = wtd.Ecdf(.$x_var)$ecdf) %>% 
  tidyr::unnest()

您不能像在?mutate中所说的那样使用mutate,mutate“保留输入的行数”,但您需要更改行数

编辑:只是考虑一下,如果你这样做,你不需要tidyr::unnest

dplyr_solution2 <- df_samp %>% 
  dplyr::select(levels, x_var) %>%
  dplyr::group_by(levels) %>%
  dplyr::do( data.frame(X = wtd.Ecdf(.$x_var)$x, 
             Y = wtd.Ecdf(.$x_var)$ecdf))

编辑没有2:你是写的,dplyr::do大部分是折旧的,我打算建议一个purrr解决方案,但你特别要求dplyr。我一直认为group_map是purrr的一部分(我猜我是在同一时间发现它们)。

你可以基本上只为do提供group_map,语法上只有很小的改动:

dplyr_solution3 <- df_samp %>% 
  dplyr::select(levels, x_var) %>%group_by(levels) %>% 
  dplyr::group_map(~data.frame(X = wtd.Ecdf(.$x_var)$x, 
                        Y = wtd.Ecdf(.$x_var)$ecdf))

或者你可以换成purrr::map_dfr

purrr_solution <- df_samp %>% 
  dplyr::select(levels, x_var) %>% 
  split(.$levels) %>% 
  purrr::map_dfr(~data.frame(X = wtd.Ecdf(.$x_var)$x, 
                               Y = wtd.Ecdf(.$x_var)$ecdf), .id = "levels")
© www.soinside.com 2019 - 2024. All rights reserved.