Spalte data.frame in einen Vektor konvertieren?

161

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!).

Dolan Antenucci
quelle
5
Wie Sie in den Antworten sehen, ?'[.data.frame'bringt Sie eine genaue Lektüre von sehr weit.
Joran

Antworten:

206

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 verwirrend aframe[,2], indem Sie einen Vektor und keine Unterliste zurückgeben.

Versuchen Sie also, diese Sequenz auszuführen, und vielleicht werden die Dinge klarer:

avector <- as.vector(aframe['a2'])
class(avector) 

avector <- aframe[['a2']]
class(avector)

avector <- aframe[,2]
class(avector)
Joran
quelle
6
+1 Das ist nützlich. Ich hatte mich aframe[,"a2"]daran gewöhnt, dies sowohl mit Datenrahmen als auch mit Matrizen zu verwenden und schien die gleichen Ergebnisse zu erzielen - ein Vektor.
Iterator
8
[..., drop = F]wird immer einen
Datenrahmen zurückgeben
1
Dies ist besonders gut zu wissen, da die df$xSyntax einen Vektor zurückgibt. Ich habe diese Syntax lange Zeit verwendet, aber als ich anfangen musste, Spalten zu verwenden df['name']oder df[n]abzurufen, stieß ich auf Probleme, als ich versuchte, sie an Funktionen zu senden, die Vektoren erwarteten. Verwenden df[[n]]oder df[['x']]Aufräumen von Dingen.
Rensa
8
Warum as.vectorscheint stillschweigend keine Wirkung zu haben? Sollte dies nicht entweder einen Vektor zurückgeben oder auffällig fehlschlagen?
Bli
aframe[['a2']]ist bei sfObjekten sehr nützlich , da aframe[,"a2"]zwei Spalten zurückgegeben werden, da die Geometriespalte enthalten ist.
Matt
40

Es gibt jetzt eine einfache Möglichkeit, dies mit zu tun dplyr.

dplyr::pull(aframe, a2)
Andrew Brēza
quelle
32

Sie könnten die $Extraktion verwenden:

class(aframe$a1)
[1] "numeric"

oder die doppelte eckige Klammer:

class(aframe[["a1"]])
[1] "numeric"
James
quelle
21

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=FALSEOption [:

R> aframe <- data.frame(a1=c1:5, a2=6:10, a3=11:15)
R> aframe
  a1 a2 a3
1  1  6 11
2  2  7 12
3  3  8 13
4  4  9 14
5  5 10 15
R> avector <- aframe[, "a2"]
R> avector
[1]  6  7  8  9 10
R> avector <- aframe[, "a2", drop=FALSE]
R> avector
  a2
1  6
2  7
3  8
4  9
5 10
R> 
Dirk Eddelbuettel
quelle
4
+1: Die Erinnerung an drop=FALSEist 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.
Iterator
Ich verwende dies, wenn ich die Anzahl der ausgewählten Spalten nicht vorhersehen kann und falls eine Spalte angezeigt wird, wird das Ergebnis immer noch als data.frame mit n Spalten übergeben. Ein Vektor kann einen Schraubenschlüssel in die Funktionen auf der ganzen Linie werfen.
Roman Luštrik
11

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

data[["column_name"]] 

ist das Beste.

joel.wilson
quelle
8

Sie können so etwas versuchen-

as.vector(unlist(aframe$a2))
Vaibhav Sharma
quelle
Dies ist gut, wenn Sie zwei Spalten mit vergleichen möchten identical.
P-Roboter
5

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.

>  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)
> aframe[,'a2']
[1]  6  7  8  9 10
> class(aframe[,'a2'])
[1] "numeric"
Ari B. Friedman
quelle
5
as.vector(unlist(aframe['a2']))
Dr_Hope
quelle
3
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)
avector <- as.vector(aframe['a2'])

avector<-unlist(avector)
#this will return a vector of type "integer"
Shubham Ranjan
quelle
2

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:

# assuming you have a 1 column dataframe called "df"
list <- c()
for(i in 1:nrow(df)){
  list <- append(list, df[i,1])
}
View(list)
# This list is not a dataframe, it is a list of values
# You can filter a dataframe using "subset([Data], [Column] %in% list")
Adrian DSouza
quelle
1

Wir können data.frame-Spalten auch generisch in einen einfachen Vektor konvertieren. as.vectorist nicht genug, da die Klasse und Struktur von data.frame beibehalten wird. Daher müssen wir auch das erste (und einzige) Element herausziehen:

df_column_object <- aframe[,2]
simple_column <- df_column_object[[1]]

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.

0Bereich
quelle