Structure

Soit m, un objet :

m <- structure(
      1:9,
      .Dim = c(3L, 3L),
      .Dimnames = list(c("A", "B", "C"), c("Jan", "Feb", "Mar")))

Dans la console :

> m
  Jan Feb Mar
A   1   4   7
B   2   5   8
C   3   6   9
> class(m)
[1] "matrix"

C’est-à-dire que m est une matrice, exactement la même que sui vous aviez exécuté :

m <- matrix(1:9, 3, 3,, list(c("A", "B", "C"), c("Jan", "Feb", "Mar")))

Cette forme de m exprimée avec structure(...), c'est celle que vous obtiendriez en utilisant la fonction dump ; c'est une représentation de m avec ses données (1:9) et ses attributs (.Dim et .Dimnames).

> attributes(m)
$dim
[1] 3 3

$dimnames
$dimnames[[1]]
[1] "A" "B" "C"

$dimnames[[2]]
[1] "Jan" "Feb" "Mar"

Pour vous débarrasser de l'attribut .Dimnames, par exemple, il suffit d'écrire :

> attr(m, "dimnames") <- NULL
> m
     [,1] [,2] [,3]
[1,]    1    4    7
[2,]    2    5    8
[3,]    3    6    9

La fonction unname fait la même chose. A ce stade, la représentation de votre objet m ressemble à ceci :

m <- structure(1:9, .Dim = c(3L, 3L))

De la même manière, vous pouvez casser les dimensions de m en exécutant :

> attr(m, "dim") <- NULL
> m
[1] 1 2 3 4 5 6 7 8 9

Si vous faites ça, m n'est plus que :

m <- 1:9

Et :

> class(m)
[1] "integer"

C'est exactement ce que vous faites lorsque vous exécutez une fonction comme as.numeric sur une matrice, vous cassez ses dimensions et, par la même occasion, supprimez les noms desdites dimensions.

Voici quelques structures-types :

# vector (with names)
v <- structure(
      c(100, 99, 101),
      .Names = c("Jan", "Feb", "Mar"))

# matrix (with dimnames)
m <- structure(
      1:9,
      .Dim = c(3L, 3L),
      .Dimnames = list(c("A", "B", "C"), c("Jan", "Feb", "Mar")))

# factor
f <- structure(
 c(1L, 2L, 3L, 4L, 5L, 6L, 7L, 8L, 9L, 10L, 11L, 12L),
 .Label = c(month.abb),
 class = "factor")

# list
l <- structure(
      list( Month = c("Jan", "Feb", "Mar"),
            Value = c(100, 99, 101)),
      .Names = c("Month", "Value"))

# data.frame
d <- structure(
      list( Month = structure(
                  1:12,
             .Label = c("Jan", "Feb", "Mar", "Apr", "May", "Jun", "Jul",
                  "Aug", "Sep", "Oct", "Nov", "Dec"),
             class = "factor"),
            Value = 1:12),
      .Names = c("Month", "Value"),
      row.names = c(NA, -3L),
      class = "data.frame")

Où vous comprenez pourquoi il ne sert à rien d'essayer de casser l'attribut .Dim d'un dataframe (il n'y a rien à casser). En revanche, vous pouvez faire ça :

> class(d) <- "list"
> d
$Month
 [1] Jan Feb Mar Apr May Jun Jul Aug Sep Oct Nov Dec
Levels: Jan Feb Mar Apr May Jun Jul Aug Sep Oct Nov Dec

$Value
 [1]  1  2  3  4  5  6  7  8  9 10 11 12

attr(,"row.names")
[1] 1 2 3
> class(d)
[1] "list"

Aucun commentaire:

Enregistrer un commentaire