Konvertieren Sie eine Zeile eines Datenrahmens in einen Vektor


116

Ich möchte einen Vektor aus einer Zeile eines Datenrahmens erstellen. Aber ich möchte keine Zeilen- und Spaltennamen haben müssen. Ich habe verschiedene Dinge ausprobiert ... hatte aber kein Glück.

Dies ist mein Datenrahmen:

> df <- data.frame(a=c(1,2,4,2),b=c(2,6,2,1),c=c(2.6,8.2,7.5,3))
> df
  a b   c
1 1 2 2.6
2 2 6 8.2
3 4 2 7.5
4 2 1 3.0

Ich habe es versucht:

> newV <- as.vector(df[1,])
> newV
  a b   c
1 1 2 2.6

Aber ich möchte wirklich, dass so etwas aussieht:

> newV <- c( 1,2,2.6)
> newV
[1] 1.0 2.0 2.6

Ich schlage vor, Sie formatieren die angezeigten Daten richtig. Sieht so aus, als würden Ihnen einige Zeilenumbrüche fehlen.
Chinmay Patil

Ich will eine Reihe. Zeile '1' und nicht Spalte 'a'.
Joko

Gibt es eine Möglichkeit, dies auf alle Zeilen eines Datenrahmens anzuwenden und dadurch alle Vektoren zu einem einzigen Vektor zusammenzuführen?
stephanmg

1
@stephanmg: Was ist mit so etwas wie : c(t(as.matrix(df)))?
Andri Signorell

Andri: Das funktioniert, obwohl ich es auch anders lösen könnte.
stephanmg

Antworten:


154

Wenn Sie eine einzelne Zeile aus einem Datenrahmen extrahieren, erhalten Sie einen einzeiligen Datenrahmen. Konvertieren Sie es in einen numerischen Vektor:

as.numeric(df[1,])

Konvertiert, wie @Roland vorschlägt, den einzeiligen Datenrahmen unlist(df[1,])in einen numerischen Vektor, ohne die Namen zu löschen . Daher unname(unlist(df[1,]))ist ein anderer, etwas expliziterer Weg, um zum gleichen Ergebnis zu gelangen.

Wie @Josh unten kommentiert, benötigen Sie as.character(df[1,])stattdessen einen nicht vollständig numerischen Datenrahmen (alphabetisch, Faktor, gemischt ...) .


Es könnte +1 (oder 0 Abwärtsstimmen) für das OP sein, um Code zu geben, der klar illustriert, was sie wollten, obwohl der Text und der Titel der Frage verstümmelt waren ...
Ben Bolker

@ChinmayPatil, was sind ihre anderen Optionen? Ihr Codebeispiel lässt es sicher so aussehen, wie sie es wollen.
Ben Bolker

2
Es sollte beachtet werden, dass ein Datenrahmen bereits ein Vektor ist und daher als Vektor sieht, dass er ein Vektor der Modus- "Liste" ist und nichts tut. Um das Verständnis der zugrunde liegenden Mechanismen zu erleichtern, versuchen Sie es mit einem Vektor (df [1,], mode = "numeric"), der veranschaulichender ist. Dies ist, was as.numeric tut.

1
kein Problem. Ich sage nur, dass sie für dieses Problem genau die gleiche Antwort geben.
Ben Bolker

1
Könnte in der Zwischenzeit geändert worden sein, aber heute erlaubt die Auflistung das Löschen von Namen: identical(unlist(df[1,], use.names = FALSE), as.numeric(df[1,])) (und übrigens ist df immer noch kein vernünftiger Name für einen data.frame ... ;-))
Andri Signorell

45

Ich empfehle unlist, die Namen zu behalten.

unlist(df[1,])
  a   b   c 
1.0 2.0 2.6 

is.vector(unlist(df[1,]))
[1] TRUE

Wenn Sie keinen benannten Vektor möchten:

unname(unlist(df[1,]))
[1] 1.0 2.0 2.6

7

Wenn Sie nicht auf numerisch wechseln möchten, können Sie dies versuchen.

> as.vector(t(df)[,1])
[1] 1.0 2.0 2.6

3
dies macht nicht viel Sinn für mich: str(as.vector(t(df)[,1]))ist num [1:3] 1 2 2.6, dh der Code nicht die Ergebnisse in einen numerischen Vektor ... konvertieren
Ben Bolker

2
t(df)Insbesondere wenn Sie R verwenden, wird der Datenrahmen zu einer Matrix gezwungen, in diesem Fall zu einer numerischen Matrix, da alle Elemente numerisch sind. Dann [,1]extrahiert die erste Spalte (ein numerisches Vektor, da die redundante Dimension automatisch gelöscht wird). as.vector()Lässt einfach die Namen fallen (was Sie auch tun könnten unname()).
Ben Bolker

Es scheint auch für Charaktere zu funktionieren. Aber Sie haben Recht mit dem Zusammenhalt. FWIW, meine Lösung wird auch auf Zeichendatenrahmen funktionieren. Mit Vorbehalt, dass alle Daten in Zeichen konvertiert werden
Chinmay Patil

2
Ich würde sagen, dass die unname(unlist(x))Lösung etwas besser ist (effizienter und transparenter).
Ben Bolker

as.vector(t(df)[,1])Ich liebe es ! Genau das, was ich brauche!
Uther Pendragon

7

Hier ist eine dplyrbasierte Option:

newV = df %>% slice(1) %>% unlist(use.names = FALSE)

# or slightly different:
newV = df %>% slice(1) %>% unlist() %>% unname()

2

Beachten Sie, dass Sie vorsichtig sein müssen, wenn Ihre Zeile einen Faktor enthält. Hier ist ein Beispiel:

df_1 = data.frame(V1 = factor(11:15),
                  V2 = 21:25)
df_1[1,] %>% as.numeric() # you expect 11 21 but it returns 
[1] 1 21

Hier ist ein weiteres Beispiel (standardmäßig konvertiert data.frame () Zeichen in Faktoren)

df_2 = data.frame(V1 = letters[1:5],
                  V2 = 1:5)
df_2[3,] %>% as.numeric() # you expect to obtain c 3 but it returns
[1] 3 3
df_2[3,] %>% as.character() # this won't work neither
[1] "3" "3"

Um dieses Verhalten zu verhindern, müssen Sie sich vor dem Extrahieren um den Faktor kümmern:

df_1$V1 = df_1$V1 %>% as.character() %>% as.numeric()
df_2$V1 = df_2$V1 %>% as.character()
df_1[1,] %>% as.numeric()
[1] 11  21
df_2[3,] %>% as.character()
[1] "c" "3"

-3

Spalten von Datenrahmen sind bereits Vektoren, Sie müssen sie nur herausziehen. Beachten Sie, dass Sie die gewünschte Spalte nach dem Komma und nicht davor platzieren:

> newV <- df[,1]
> newV
[1] 1 2 4 2

Wenn Sie tatsächlich eine Reihe wollen, dann tun Sie, was Ben gesagt hat, und verwenden Sie die Wörter in Zukunft bitte richtig.


aber ich denke das OP will die erste Reihe ?
Ben Bolker

1
@ BenBolker Vielleicht ja ... Ich habe nur angenommen, dass er wollte, was sein Titel und seine Frage sagten, dass er wollte.
Jonathan Christensen
Durch die Nutzung unserer Website bestätigen Sie, dass Sie unsere Cookie-Richtlinie und Datenschutzrichtlinie gelesen und verstanden haben.
Licensed under cc by-sa 3.0 with attribution required.