vqv / ggbiplot

A biplot based on ggplot2
302 stars 159 forks source link

updating plyr to dplyr #75

Open tavad opened 1 year ago

tavad commented 1 year ago

I had some comparability problems between plyr and tidyverse (dplyr) in the following function that draws ellipses:

plyr implantation:

ell <- plyr::ddply(df.u, "groups", function(x) { if (nrow(x) <= 2) { return(NULL) } sigma <- var(cbind(x$xvar, x$yvar)) mu <- c(mean(x$xvar), mean(x$yvar)) ed <- sqrt(qchisq(ellipse.prob, df = 2)) data.frame(sweep(circle %% chol(sigma) ed, 2, mu, FUN = "+"), groups = x$groups[1]) })

I have rewritten this function in dplyr It is a bit long, but it does the job and does not have comparability issues. The run time is practically the same.

ell <- df.u %>% group_by(groups) %>% filter(n() > 2) %>% summarize( sigma = list(var(cbind(xvar, yvar))), mu = list(c(mean(xvar), mean(yvar))), ed = sqrt(qchisq(ellipse.prob, df = 2)), circle_chol = list(circle %% chol(sigma[[1]]) ed), ell = list(sweep(circle_chol[[1]], 2, mu[[1]], FUN = "+")), xvar = map(ell, ~.x[,1]), yvar = map(ell, ~.x[,2]), .groups = "drop" ) %>% select(xvar, yvar, groups) %>% unnest(c(xvar, yvar))