>>>>> Gabor Grothendieck >>>>> on Thu, 14 May 2020 06:56:06 -0400 writes:
> If you are looking at ftable could you also consider adding > a way to convert an ftable into a usable data.frame such as > the ftable2df function defined here: > https://stackoverflow.com/questions/11141406/reshaping-an-array-to-data-frame/11143126#11143126 > and there is an example of using it here: > https://stackoverflow.com/questions/61333663/manipulating-an-array-into-a-data-frame-in-base-r/61334756#61334756 > Being able to move back and forth between various base class representations > seems like something that would be natural to provide. Sure! But there is already an as.data.frame() method for "ftable", {and I would not want the if(! .. ftable) ftable(x) part anyway. What I think many useRs / programmeRs very often forget about is more-than-2-dimensional arrays {which *are* at the beginning of that SO question} and that these are often by far the most efficient data structure (rather than the corresponding data frames). and even less people forget that a "table" in base R is just a special case of a 1-D, 2-D, 3-D, .... array. (Semantically a special case: "array" with non-negative integer content I'd claim that everything you here ("move back and forth between ...") is already there in the "ftable" implementation in stats, notably in the source file src/library/stats/R/ftable.R -> https://svn.r-project.org/R/trunk/src/library/stats/R/ftable.R The problem may be in 1) too sparse documentation about the close relations "ftable" <-> "array" <-> "table" <-> "data.frame" 2) people not thinking often enough about more-than-2D-arrays and the special corresponding class "table" in R. To start with one: > str(UCBAdmissions) 'table' num [1:2, 1:2, 1:6] 512 313 89 19 353 207 17 8 120 205 ... - attr(*, "dimnames")=List of 3 ..$ Admit : chr [1:2] "Admitted" "Rejected" ..$ Gender: chr [1:2] "Male" "Female" ..$ Dept : chr [1:6] "A" "B" "C" "D" ... > and look at the *examples* in the help files and the S3 methods methods(class = "ftable") [1] as.data.frame as.matrix as.table format head print [7] tail see '?methods' for accessing help and source code > methods(class = "table") [1] [ aperm as.data.frame Axis coerce initialize [7] lines plot points print show slotsFromS3 [13] summary tail see '?methods' for accessing help and source code > ... need to close now, there's more to be said ... > On Thu, May 14, 2020 at 5:32 AM Martin Maechler > <maech...@stat.math.ethz.ch> wrote: >> >> >>>>> SOEIRO Thomas >> >>>>> on Wed, 13 May 2020 20:27:15 +0000 writes: >> >> > Dear all, >> > I haven't received any feedback so far on my proposal to make "justify" argument available in stats:::format.ftable >> >> > Is this list the appropriate place for this kind of proposal? >> >> Yes, it is.. Actually such a post is even a "role model" post >> for R-devel. >> >> > I hope this follow-up to my message won't be taken as rude. Of course it's not meant to be, but I'm not used to the R mailing lists... >> >> well, there could be said much, and many stories told here ... ;-) >> >> > Thank you in advance for your comments, >> >> > Best, >> > Thomas >> >> The main reasons for "no reaction" (for such nice post) probably >> are combination of the following >> >> - we are busy >> - if we have time, we think other things are more exciting >> - we have not used ftable much/at all and are not interested. >> >> Even though the first 2 apply to me, I'll have a 2nd look into >> your post now, and may end up well agreeing with your proposal. >> >> Martin Maechler >> ETH Zurich and R Core team >> >> >> >> >> >> Dear all, >> >> >> >> justify argument is hard coded in format.ftable: >> >> >> >> cbind(apply(LABS, 2L, format, justify = "left"), >> >> apply(DATA, 2L, format, justify = "right")) >> >> >> >> It would be useful to have the possibility to modify the argument between c("left", "right", "centre", "none") as in format.default. >> >> >> >> The lines could be changed to: >> >> >> >> if(length(justify) != 2) >> >> stop("justify must be length 2") >> >> cbind(apply(LABS, 2L, format, justify = justify[1]), >> >> apply(DATA, 2L, format, justify = justify[2])) >> >> >> >> The argument justify could defaults to c("left", "right") for backward compatibility. >> >> >> >> It could then allow: >> >> ftab <- ftable(wool + tension ~ breaks, warpbreaks) >> >> format.ftable(ftab, justify = c("none", "none")) >> >> >> >> Best regards, >> >> >> >> Thomas > -- > Statistics & Software Consulting > GKX Group, GKX Associates Inc. > tel: 1-877-GKX-GROUP > email: ggrothendieck at gmail.com ______________________________________________ R-devel@r-project.org mailing list https://stat.ethz.ch/mailman/listinfo/r-devel