Ich habe einen Datenrahmen wie:
a1 = c(1, 2, 3, 4, 5)
a2 = c(6, 7, 8, 9, 10)
a3 = c(11, 12, 13, 14, 15)
aframe = data.frame(a1, a2, a3)
Ich habe Folgendes versucht, um eine der Spalten in einen Vektor zu konvertieren, aber es funktioniert nicht:
avector <- as.vector(aframe['a2'])
class(avector)
[1] "data.frame"
Dies ist die einzige Lösung, die ich finden könnte, aber ich gehe davon aus, dass es einen besseren Weg geben muss, dies zu tun:
class(aframe['a2'])
[1] "data.frame"
avector = c()
for(atmp in aframe['a2']) { avector <- atmp }
class(avector)
[1] "numeric"
Hinweis: Mein Wortschatz oben ist möglicherweise nicht korrekt. Bitte korrigieren Sie mich, wenn dies der Fall ist. Ich lerne immer noch die Welt von R. Außerdem ist jede Erklärung, was hier vor sich geht, willkommen (dh es würde helfen, sich auf Python oder eine andere Sprache zu beziehen!).
r
dataframe
vector
type-conversion
Dolan Antenucci
quelle
quelle
?'[.data.frame'
bringt Sie eine genaue Lektüre von sehr weit.Antworten:
Ich werde versuchen, dies zu erklären, ohne Fehler zu machen, aber ich wette, dass dies ein oder zwei Klarstellungen in den Kommentaren hervorruft.
Ein Datenrahmen ist eine Liste. Wenn Sie
[
einen Datenrahmen mit dem Namen einer Spalte und unterteilen , erhalten Sie eine Unterliste (oder einen Unterdatenrahmen ). Wenn Sie die eigentliche Atomspalte wollen, können Sie sie verwenden[[
oder (für mich) etwas verwirrendaframe[,2]
, indem Sie einen Vektor und keine Unterliste zurückgeben.Versuchen Sie also, diese Sequenz auszuführen, und vielleicht werden die Dinge klarer:
quelle
aframe[,"a2"]
daran gewöhnt, dies sowohl mit Datenrahmen als auch mit Matrizen zu verwenden und schien die gleichen Ergebnisse zu erzielen - ein Vektor.[..., drop = F]
wird immer einendf$x
Syntax einen Vektor zurückgibt. Ich habe diese Syntax lange Zeit verwendet, aber als ich anfangen musste, Spalten zu verwendendf['name']
oderdf[n]
abzurufen, stieß ich auf Probleme, als ich versuchte, sie an Funktionen zu senden, die Vektoren erwarteten. Verwendendf[[n]]
oderdf[['x']]
Aufräumen von Dingen.as.vector
scheint stillschweigend keine Wirkung zu haben? Sollte dies nicht entweder einen Vektor zurückgeben oder auffällig fehlschlagen?aframe[['a2']]
ist beisf
Objekten sehr nützlich , daaframe[,"a2"]
zwei Spalten zurückgegeben werden, da die Geometriespalte enthalten ist.Es gibt jetzt eine einfache Möglichkeit, dies mit zu tun
dplyr
.quelle
Sie könnten die
$
Extraktion verwenden:oder die doppelte eckige Klammer:
quelle
Sie brauchen nicht
as.vector()
, aber Sie brauchen eine korrekte Indizierung:avector <- aframe[ , "a2"]
Die eine andere Sache, die Sie beachten sollten, ist die
drop=FALSE
Option[
:quelle
drop=FALSE
ist nützlich - dies hilft mir in Fällen, in denen ich N Spalten aus einem Datenrahmen auswählen kann, in Fällen, in denen N = 1 ist.Ein weiterer Vorteil der Verwendung des Operators '[[' besteht darin, dass er sowohl mit data.frame als auch mit data.table funktioniert. Wenn also die Funktion sowohl für data.frame als auch für data.table ausgeführt werden muss und Sie eine Spalte als Vektor daraus extrahieren möchten
ist das Beste.
quelle
Sie können so etwas versuchen-
quelle
identical
.Wenn Sie nur den Extraktionsoperator verwenden, funktioniert es. Standardmäßig legt [] die Option fest
drop=TRUE
, die Sie hier wünschen. Siehe?'['
für weitere Details.quelle
quelle
quelle
Ich verwende Listen, um Datenrahmen danach zu filtern, ob sie einen Wert% in% einer Liste haben oder nicht.
Ich hatte manuell Listen erstellt, indem ich einen 1-Spalten-Datenrahmen nach Excel exportiert hatte, wo ich "" um jedes Element hinzufügte, bevor ich in R: list <- c ("el1", "el2", ...) einfügte, was normalerweise der Fall war gefolgt von FilteredData <- Teilmenge (Daten, Spalte% in% Liste).
Nachdem ich nach Stackoverflow gesucht und keine intuitive Möglichkeit gefunden habe, einen 1-Spalten-Datenrahmen in eine Liste zu konvertieren, veröffentliche ich jetzt meinen ersten Stackoverflow-Beitrag:
quelle
Wir können data.frame-Spalten auch generisch in einen einfachen Vektor konvertieren.
as.vector
ist nicht genug, da die Klasse und Struktur von data.frame beibehalten wird. Daher müssen wir auch das erste (und einzige) Element herausziehen:Alle bisher vorgeschlagenen Lösungen erfordern die Hardcodierung von Spaltentiteln. Dies macht sie nicht generisch (stellen Sie sich vor, Sie wenden dies auf Funktionsargumente an).
Alternativ können Sie natürlich zuerst die Spaltennamen aus der Spalte lesen und sie dann in den Code der anderen Lösungen einfügen.
quelle