2016-10-26 1 views
0

Angenommen, ich habe eine DatenrahmenWie werden Spalten beim Erstellen eines Datenrahmens aus verschiedenen Datenrahmenspalten benannt?

df1 = data.frame(df1.a=1:3, df1.b=1:3, df1.c=1:3) 

    df1.a df1.b df1.c 
1  1  1  1 
2  2  2  2 
3  3  3  3 

und eine zweite von der ersten erstellen mit verschiedenen Selektoren:

df2 = data.frame(df2.a=df1$df1.a, df2.b=df1[,"df1.b"], df2.c=df1["df1.c"]) 

Warum der Spaltenname der dritten Spalte von der ursprünglichen Spalte überschrieben bekommen Name und die anderen nicht?

df2.a df2.b df1.c <-- why is this not df2.c?? 
1  1  1  1 
2  2  2  2 
3  3  3  3 
+3

Sie ein Komma verpasst '(,)' in 'df2.c = df1 ["df1.c"] ', sollte es' df2.c = df1 [, "df1.c"] ' –

+1

sein, du setzt stattdessen eine' liste' ('df1 [" df1.c "]') eines 'vector' (' df1 [, "df1.c"] 'oder' df1 [["df1.c"]] ') in Ihrem zweiten' dat.frame', der 'name' ist dabei. – Cath

Antwort

3

Das heißt, weil ein df1["df1.a"] data.frame einer Spalte ist, während df1[,"df1.a"] ist ein Vektor.

Versuchen

> class(df1[,"df1.a"]) 
[1] "integer" 
> class(df1["df1.a"]) 
[1] "data.frame" 

Nach der Dokumentation:

Für eine Namen oder unbenannte Matrix/Liste/Datenrahmen Argument, das eine einzelne Spalte enthält, die Spaltennamen im Ergebnis ist der Spaltenname in das Argument.

Deshalb ist das Argument Name in

data.frame(…, df2.c=df1["df1.c"]) 

wird "ignoriert" und der Anruf so behandelt, als

data.frame(…, df1.c=df1$df1.c) 

Natürlich ist das Argument Name technisch nicht außer Acht gelassen.


Was warum das ist-die Spalte Namensgebung ist komplex:

Wie die Namen des Datenrahmens erstellt werden, ist komplex, und der Rest dieses Absatzes ist nur der Grund Geschichte.

Zum Beispiel versuchen

data.frame(df2.x = df1[c("df1.a", "df1.b")]) 
    df2.x.df1.a df2.x.df1.b 
1   1   1 
2   2   2 
3   3   3 

(Dank Roman zu einem besseren Teil der Dokumentation zeigt.)

+0

Danke, ich verstehe jetzt. Dennoch erscheint es mir kontraintuitiv, dass der Name, den ich * explizit * spezifiziere, durch den impliziten Namen aus dem Datenrahmen überschrieben wird. –

+3

@GregorSturm eine bessere Erklärung ist in der Values-Sektion des '? Dat.frame':" Für ein benanntes oder unbenanntes Matrix/Liste/Datenrahmen-Argument, das eine einzelne Spalte enthält, ist der Spaltenname im Ergebnis der Spaltenname in das Argument." –

Verwandte Themen