From gregor.gorjanc at bfro.uni-lj.si  Mon Mar 20 16:53:11 2006
From: gregor.gorjanc at bfro.uni-lj.si (Gregor Gorjanc)
Date: Mon, 20 Mar 2006 16:53:11 +0100
Subject: [Rd] levels for list and data.frame
Message-ID: <441ECFE7.9080800@bfro.uni-lj.si>

Hello!

Does R core find the following pacth usefull - I created methods for
levels for list and data.frame, which can be usefull to get a list of
levels for entries in a list or columns in a data.frame. Patch is
attached and shown bellow example

# Example
> tmp <- list()
> tmp$a <- factor(letters[1:10])
> tmp$b <- factor(letters[5:14])
> tmp$c <- 1:10
> tmp1 <- as.data.frame(tmp)
> tmp2 <- list()
> tmp2$"1" <- tmp
> tmp2$"2" <- tmp1
> str(tmp2)
List of 2
 $ 1:List of 3
  ..$ a: Factor w/ 10 levels "a","b","c","d",..: 1 2 3 4 5 6 7 8 9 10
  ..$ b: Factor w/ 10 levels "e","f","g","h",..: 1 2 3 4 5 6 7 8 9 10
  ..$ c: int [1:10] 1 2 3 4 5 6 7 8 9 10
 $ 2:`data.frame':      10 obs. of  3 variables:
  ..$ a: Factor w/ 10 levels "a","b","c","d",..: 1 2 3 4 5 6 7 8 9 10
  ..$ b: Factor w/ 10 levels "e","f","g","h",..: 1 2 3 4 5 6 7 8 9 10
  ..$ c: int [1:10] 1 2 3 4 5 6 7 8 9 10

> levels(tmp2)
$"1"
$"1"$a
 [1] "a" "b" "c" "d" "e" "f" "g" "h" "i" "j"

$"1"$b
 [1] "e" "f" "g" "h" "i" "j" "k" "l" "m" "n"


$"2"
$"2"$a
 [1] "a" "b" "c" "d" "e" "f" "g" "h" "i" "j"

$"2"$b
 [1] "e" "f" "g" "h" "i" "j" "k" "l" "m" "n"

> levels(tmp2, drop = FALSE)
$"1"
$"1"$a
 [1] "a" "b" "c" "d" "e" "f" "g" "h" "i" "j"

$"1"$b
 [1] "e" "f" "g" "h" "i" "j" "k" "l" "m" "n"

$"1"$c
NULL


$"2"
$"2"$a
 [1] "a" "b" "c" "d" "e" "f" "g" "h" "i" "j"

$"2"$b
 [1] "e" "f" "g" "h" "i" "j" "k" "l" "m" "n"

$"2"$c
NULL

----------------------------------------------------------------------

$ svn diff factor.R
Index: factor.R
===================================================================
--- factor.R    (revision 37559)
+++ factor.R    (working copy)
@@ -25,7 +25,25 @@
 ## Help old S users:
 category <- function(...) .Defunct()

-levels <- function(x) attr(x, "levels")
+levels <- function(x, ...) UseMethod("levels")
+
+levels.default <- function(x, ...) attr(x, "levels")
+
+levels.list <- function(x, drop = TRUE)
+{
+    tmp <- lapply(x, levels, drop = drop)
+    if (drop) {
+        tmp1 <- unlist(lapply(tmp, is.null))
+        tmp <- tmp[!tmp1]
+    }
+    return(tmp)
+}
+
+levels.data.frame <- function(x, ...)
+{
+    return(levels.list(x, ...))
+}
+
 nlevels <- function(x) length(levels(x))

 "levels<-" <- function(x, value) UseMethod("levels<-")

-- 
Lep pozdrav / With regards,
    Gregor Gorjanc

----------------------------------------------------------------------
University of Ljubljana     PhD student
Biotechnical Faculty
Zootechnical Department     URI: http://www.bfro.uni-lj.si/MR/ggorjan
Groblje 3                   mail: gregor.gorjanc <at> bfro.uni-lj.si

SI-1230 Domzale             tel: +386 (0)1 72 17 861
Slovenia, Europe            fax: +386 (0)1 72 17 888

----------------------------------------------------------------------
"One must learn by doing the thing; for though you think you know it,
 you have no certainty until you try." Sophocles ~ 450 B.C.
----------------------------------------------------------------------
-------------- next part --------------
A non-text attachment was scrubbed...
Name: factor.R.diff.gz
Type: application/x-gzip
Size: 361 bytes
Desc: not available
Url : https://stat.ethz.ch/pipermail/r-devel/attachments/20060320/522fdf5f/attachment.gz 


[Rd] levels for list and data.frame
Gregor Gorjanc