[R] Unexpected behavior of extract (`[`) or sapply functions

Prof Brian Ripley ripley at stats.ox.ac.uk
Fri Oct 7 10:05:44 CEST 2011


On Fri, 7 Oct 2011, Petr PIKAL wrote:

> Hi
>
> Is it necessary to use sapply? With lapply you will get what you want.

Another possibility is to use vapply.

sapply's simplification is only 'unexpected' by those who have not 
studied its help page.  See the posting guide ....

>
> Regards
> Petr
>
>
>>
>>
>> Dear folks--
>> The function below is a snippet of a larger function that is not doing
> what
>> it is supposed to do, and I do not understand its behavior.  The larger
>> function is supposed to produce an array containing the results of a
>> user-specified function applied to groups of data defined by the
>> intersection of one or more factors, and return them in an array with a
>> dimension for each factor and a dimension level for each factor level.
> This
>> snippet is supposed to take a data frame, a vector of column numbers
>> containing factors, and a column number for the data, and return (in the
>> test function below, just print) a list of character vectors of the
> level
>> names (one vector per dimension) and the length of those vectors.
>>
>> It works fine so long as I give it more than one factor column, but if I
>> give it a vector of factor columns of length 1, it behave differently
> and
>> when I try to assign the names from test.levels to the dimnames of the
>> array,  I end up with an error message:
>>
>> Error in dimnames(data) <- dimnames :
>>   length of 'dimnames' [1] not equal to array extent
>>
>> The example below shows the function output for a test data frame
>> (“test.df”) when run first of a vector of two column number for factors
> and
>> then on just one. You can see how the structure of the output shifts.  I
> can
>> not understand what is happening. What I want it to do when given just
>> factor cols =c(1)  is to give me back exactly what it gives me bact for
>> factor colum 1 in factor.cols = c(1,2).
>>
>> Any help or suggestions would be greatly appreciated.
>>
>> Sincerely,
>>    andrewH
>>
>> # Test Data
>> test.df <- data.frame(AA=rep(LETTERS[1:2], c(6,6)),BB=rep(LETTERS[3:5],
>> c(4,4,4)),
>>                               CC=rep(LETTERS[6:9],c(3,3,3,3)),
> DD=c(1:12))
>>
>> # The function
>> getLevels <- function(data.df, factor.cols, data.col){
>> test.levels <- sapply(test.df[,factor.cols, drop=F], levels)
>> cat("test.levels:\n"); print(test.levels)
>> no.levels <- sapply(sapply(data.df[,factor.cols, drop=F], levels),
> length)
>> cat("no.levels:\n"); print(no.levels)
>> }
>>
>> # Run it with two factors and again with 1, Output below
>> cat("\nTest 2 factors:\n")
>> getLevels(test.df, c(1,2), 4)
>> cat("\nTest 1 factor:\n")
>> getLevels(test.df, c(1), 4)
>>
>> Test 2 factors:
>>> getLevels(test.df, c(1,2), 4)
>> test.levels=
>> $AA
>> [1] "A" "B"
>>
>> $BB
>> [1] "C" "D" "E"
>>
>> no.levels=AA BB
>>  2  3
>>> cat("\nTest 1 factor:\n")
>>
>> Test 1 factor:
>>> getLevels(test.df, c(1), 4)
>> test.levels=     AA
>> [1,] "A"
>> [2,] "B"
>> no.levels=A B
>> 1 1
>>
>>
>> --
>> View this message in context: http://r.789695.n4.nabble.com/Unexpected-
>> behavior-of-extract-or-sapply-functions-tp3881176p3881176.html
>> Sent from the R help mailing list archive at Nabble.com.
>>
>> ______________________________________________
>> R-help at r-project.org mailing list
>> https://stat.ethz.ch/mailman/listinfo/r-help
>> PLEASE do read the posting guide
> http://www.R-project.org/posting-guide.html
>> and provide commented, minimal, self-contained, reproducible code.
>
> ______________________________________________
> R-help at r-project.org mailing list
> https://stat.ethz.ch/mailman/listinfo/r-help
> PLEASE do read the posting guide http://www.R-project.org/posting-guide.html
> and provide commented, minimal, self-contained, reproducible code.
>

-- 
Brian D. Ripley,                  ripley at stats.ox.ac.uk
Professor of Applied Statistics,  http://www.stats.ox.ac.uk/~ripley/
University of Oxford,             Tel:  +44 1865 272861 (self)
1 South Parks Road,                     +44 1865 272866 (PA)
Oxford OX1 3TG, UK                Fax:  +44 1865 272595


More information about the R-help mailing list