Noms de lignes et noms de colonnes dans R

Les paires de fonctions suivantes génèrent-elles exactement les mêmes résultats?

Pair 1) names() & colnames()

Paire 2) rownames() et row.names()

    Comme l’a dit Oscar Wilde

    La consistance est le dernier refuge de l’inimaginable.

    R est plus un langage évolué que conçu, donc ces choses arrivent. names() et colnames() fonctionnent sur un data.frame mais names() ne fonctionne pas sur une masortingce:

     R> DF <- data.frame(foo=1:3, bar=LETTERS[1:3]) R> names(DF) [1] "foo" "bar" R> colnames(DF) [1] "foo" "bar" R> M <- matrix(1:9, ncol=3, dimnames=list(1:3, c("alpha","beta","gamma"))) R> names(M) NULL R> colnames(M) [1] "alpha" "beta" "gamma" R> 

    Juste pour développer un peu l’exemple de Dirk:

    Il est utile de penser à un bloc de données en tant que liste avec des vecteurs de même longueur. C’est probablement pourquoi les names fonctionnent avec un bloc de données mais pas avec une masortingce.

    Les autres fonctions utiles sont dimnames qui renvoie les noms pour chaque dimension. Vous remarquerez que la fonction rownames ne fait que rownames le premier élément des dimnames .

    En rownames qui concerne les rownames et les row.names : je ne peux pas faire la différence, bien que les rownames utilisent des dimnames alors que row.names été écrit en dehors de R. Ils semblent également fonctionner avec des tableaux de dimensions supérieures:

     >a <- array(1:5, 1:4) > a[1,,,] > rownames(a) <- "a" > row.names(a) [1] "a" > a , , 1, 1 [,1] [,2] a 1 2 > dimnames(a) [[1]] [1] "a" [[2]] NULL [[3]] NULL [[4]] NULL 

    Je pense que l’utilisation de colnames rownames Voici pourquoi.

    L’utilisation de names présente plusieurs inconvénients. Vous devez vous rappeler que cela signifie “noms de colonnes”, et que cela fonctionne uniquement avec des trames de données, vous devrez donc appeler des colnames chaque fois que vous utilisez des masortingces. En appelant colnames , vous n’avez qu’à mémoriser une fonction. Enfin, si vous examinez le code des colnames de colnames , vous verrez qu’il appelle des names dans le cas d’un colnames de données, de sorte que la sortie est identique.

    rownames et les row.names retournent les mêmes valeurs pour le row.names de données et les masortingces; La seule différence que j’ai repérée est que là où il n’y a pas de noms, les noms des rownames afficheront “NULL” (comme le font les colnames ), mais row.names renvoie de manière invisible. Comme il n’y a pas grand chose à choisir entre les deux fonctions, le nom de rownames gagne en raison de l’esthétique, car il se colnames plus joliment avec des colnames de colnames . (En outre, pour le programmeur paresseux, vous enregistrez un caractère de saisie.)

    Et une autre expansion:

     # create dummy masortingx set.seed(10) m <- matrix(round(runif(25, 1, 5)), 5) d <- as.data.frame(m) 

    Si vous voulez assigner de nouveaux noms de colonnes, vous pouvez faire suite à data.frame :

     # an identical effect can be achieved with colnames() names(d) <- LETTERS[1:5] > d ABCDE 1 3 2 4 3 4 2 2 2 3 1 3 3 3 2 1 2 4 4 4 3 3 3 2 5 1 3 2 4 3 

    Si, toutefois, vous exécutez la commande précédente sur la masortingx , vous allez tout gâcher:

     names(m) <- LETTERS[1:5] > m [,1] [,2] [,3] [,4] [,5] [1,] 3 2 4 3 4 [2,] 2 2 3 1 3 [3,] 3 2 1 2 4 [4,] 4 3 3 3 2 [5,] 1 3 2 4 3 attr(,"names") [1] "A" "B" "C" "D" "E" NA NA NA NA NA NA NA NA NA NA NA NA NA NA [20] NA NA NA NA NA NA 

    Puisque masortingce peut être considérée comme un vecteur à deux dimensions, vous n'atsortingbuez des noms qu'aux cinq premières valeurs (vous ne voulez pas faire cela, n'est-ce pas?). Dans ce cas, vous devez vous en tenir aux colnames() de colnames() .

    Donc là...