我坚持如何开发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
的另一种方法的任何建议。
怎么样(虽然也需要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")