[Rd] ftable <-> data.frame etc {was "justify hard coded in format.ftable"}
Martin Maechler
m@ech|er @end|ng |rom @t@t@m@th@ethz@ch
Fri May 15 18:24:53 CEST 2020
>>>>> 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
> <maechler using 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
More information about the R-devel
mailing list