[R] apply ( , , table)

Tony Plate tplate at blackmesacapital.com
Tue Aug 24 19:20:03 CEST 2004


apply() tries to be a bit smart about what it does (sometimes maybe too 
smart), but it actually is pretty useful a lot of the time.  It's extremely 
widely used, so changing the behavior is not an option -- changing the 
behavior would break a lot of existing code.  (Personally, I'd prefer it if 
apply() put its dimensions back together in a slightly more intelligent 
way, i.e., if apply(x, 1, c) and apply(x, 2, c) returned the same thing, 
but apply is how it is.)

In situations where you don't want apply() to try to construct a matrix 
from your results, you can wrap the results in a list, to force apply() to 
return just a list of results, e.g. (the outer "lapply()" strips off an 
unnecessary level of list depth):

 > b2 <- lapply(apply (a, 1, function(x) list(table(x))), "[[", 1)
 > length(b2)
[1] 4
 > b2[[1]]
x
1 2 6 7
2 1 1 1
 > attributes(b2[[1]])
$dim
[1] 4

$dimnames
$dimnames$x
[1] "1" "2" "6" "7"


$class
[1] "table"

Your particular case might benefit from more information given to table, 
which allows it to provide results in a more uniform format, e.g.:

 > b1 <- apply (a, 1, function(x) table(factor(x, levels=0:9)))
 > b1
   [,1] [,2] [,3] [,4]
0    0    1    0    0
1    2    1    1    2
2    1    0    0    1
3    0    1    0    0
4    0    2    2    0
5    0    0    1    1
6    1    0    0    1
7    1    0    0    0
8    0    0    1    0
9    0    0    0    0
 >

hope this helps,

Tony Plate

At Tuesday 10:42 AM 8/24/2004, White.Denis at epamail.epa.gov wrote:




>a <- matrix (c(
>     7, 1, 1, 2, 6,
>     3, 4, 0, 1, 4,
>     5, 1, 8, 4, 4,
>     6, 1, 1, 2, 5), nrow=4, byrow=TRUE)
>
>b <- apply (a, 1, table)
>
>"apply" documentation says clearly that if the rows of the result of FUN
>are the same length, then an array will be returned.  And column-major
>would be the appropriate order in R.  But "b" above is pretty opaque
>compared to what one would expect, and what one would get from "apply (
>, , table)" if the rows were not of equal length.  One needs to do
>something like
>
>n <- matrix (apply (a, 1, function (x) unique (sort (x))), nrow=nrow(a))
>
>to get the corresponding "names" of "b" to figure out the counts.
>
>Denis White
>
>______________________________________________
>R-help at stat.math.ethz.ch mailing list
>https://stat.ethz.ch/mailman/listinfo/r-help
>PLEASE do read the posting guide! http://www.R-project.org/posting-guide.html




More information about the R-help mailing list