2014-07-17 3 views
17

Ich möchte nur verstehen, wenn es einen Unterschied zwischen names und colnames bei der Arbeit mit data.frame gibt. Beide scheinen sich genauso zu verhalten. Kann ich eins durch das andere ersetzen?Was ist der Unterschied zwischen Namen und Spaltennamen

+3

Von 'colnames': " Für einen Datenrahmen, 'rownames' und' colnames' schließlich nennen 'row.names' und' names' jeweils aber letztere bevorzugt werden" – Henrik

Antwort

15

Sind sie für data.frames identisch? JA

Sind sie im Allgemeinen gleich? Nicht ganz - der große Unterschied ist, dass COLNAMES auch für Matrizen, während Namen arbeitet nicht (nur Datenrahmen).

Zusätzlich Sie können verwenden Namen zu setzen/die Namen von Vektoren erhalten (und, aus offensichtlichen Gründen, Sie können dies nicht mit COLNAMES --die Ergebnis für immer NULL ist und ein Fehler für die Einstellung).

+0

'Namen' funktioniert auch auf Vektoren. Und es funktioniert tatsächlich auf Matrizen ... es tut einfach nicht das, was Sie von ihm erwarten! – nico

+1

Re: "Namen" und Matrizen - das ist eine Art lockere Vorstellung von "arbeiten" ... Dennoch, Punkt genommen. –

+1

nur scherzen, war vor allem darauf hinzuweisen, dass es keinen Fehler wirft, und in einigen Fällen kann es durchrutschen :) – nico

8

Wenn Sie am Anfang des schauen colnames und colnames<- Funktionen Quellcode:

R> colnames 
function (x, do.NULL = TRUE, prefix = "col") 
{ 
    if (is.data.frame(x) && do.NULL) 
     return(names(x)) 
(...) 


R> `colnames<-` 
function (x, value) 
{ 
    if (is.data.frame(x)) { 
     names(x) <- value 
    } 
(...) 

Sie können für Datenrahmen sehen, dass, colnames rufen Sie die names Funktion. Also ja, sie sind genau gleichwertig.

1

Soweit ich betroffen bin, der einzige Unterschied zwischen names() und colnames() in Bezug auf einen data.frame Eingang ist, dass sie Speicher etwas anders zugeordnet. Betrachten wir zum Beispiel unter den Code Chunk:

df <- data.frame(x=1:5, y=6:10, z=11:15) 
    tracemem(df) 
    names(df) <- c("A", "B", "C") 
    colnames(df) <- c('a','b','c') 

Wenn Sie diesen Code ausführen, werden Sie sehen, dass das Kopieren von df tritt nur einmal während des names() Anruf, während das Kopieren von df zweimal während des Gesprächs colnames() auftritt.

+3

Wenn Sie nicht gerne kopieren, verwenden Sie' data.table :: setnames '(das Sie auf data.frames verwenden können). – Frank

3

names() Kisten Name Attribute wo wie colnames() Namen einfach die Spalten.

heißt

eine temporäre Variable erstellen.

> temp <- rbind(cbind(1,2,3,4,5), 
+    cbind(6,7,8,9,10)) 

> temp 
    [,1] [,2] [,3] [,4] [,5] 
[1,] 1 2 3 4 5 
[2,] 6 7 8 9 10 

Erstellen Sie das Objekt names.temp.

> names.temp <- temp 

Verwenden names() auf names.temp

> names(names.temp) <- paste(c("First col", "Second col", "Third col", 
"Fourth Col", "Fifth col")) 

> names.temp 
    [,1] [,2] [,3] [,4] [,5] 
[1,] 1 2 3 4 5 
[2,] 6 7 8 9 10 
attr(,"names") 
[1] "First col" "Second col" "Third col" "Fourth Col" "Fifth col" 
NA NA NA   
[9] NA NA  

Wir sehen hier, können wir nennen tatsächlich das fünfte Namensattribut in names.temp.

> names(names.temp)[5] 
[1] "Fifth col"  

Wiederholen Sie mit einem zweiten Objekt, aber dieses Mal schafft das colnames.temp Objekt.

> colnames.temp <- temp 

Verwenden colnames() auf colnames.temp

> colnames(colnames.temp) <- paste(c("First col", "Second col", "Third col", 
"Fourth Col", "Fifth col")) 

> colnames.temp 
    First col Second col Third col Fourth Col Fifth col 
[1,]   1   2   3   4   5 
[2,]   6   7   8   9  10 

Jetzt Attribut name NULL ist.

> names(colnames.temp)[5] 
NULL 

ENDLICH. Schauen wir uns unseren vertrauenswürdigen str() Befehl an. Wir können sehen, dass es einen Strukturunterschied zwischen names.temp und colnames.temp gibt. Insbesondere colnames.temp hat dimnames Attribute nicht names Attribute.

> str(names.temp) 
num [1:2, 1:5] 1 6 2 7 3 8 4 9 5 10 
- attr(*, "names")= chr [1:10] "First col" "Second col" "Thrid col" "Fourth  
Col" ... 
> str(colnames.temp) 
num [1:2, 1:5] 1 6 2 7 3 8 4 9 5 10 
- attr(*, "dimnames")=List of 2 
    ..$ : NULL 
    ..$ : chr [1:5] "First col" "Second col" "Thrid col" "Fourth Col" ... 
+2

Schöne erste Antwort, aber 'names()' erstellt keine Namen. 'Namen <-' tut. Es ist eine andere Funktion. – Frank

+1

Ich stehe korrigiert. Die Implikation (Leseannahme) war, Namen() aufzurufen, impliziert den Wunsch zu benennen, was eine schlechte Logik ist. Danke Frank. –

Verwandte Themen