[R] Unexpected behavior of extract (`[`) or sapply functions
Petr PIKAL
petr.pikal at precheza.cz
Fri Oct 7 09:58:45 CEST 2011
Hi
Is it necessary to use sapply? With lapply you will get what you want.
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.
More information about the R-help
mailing list