217 votes

Convertir une colonne data.frame en vecteur ?

J'ai un cadre de données tel que :

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)

J'ai essayé ce qui suit pour convertir une des colonnes en vecteur, mais cela ne fonctionne pas :

avector <- as.vector(aframe['a2'])
class(avector) 
[1] "data.frame"

C'est la seule solution que j'ai trouvée, mais je suppose qu'il doit y avoir une meilleure façon de procéder :

class(aframe['a2']) 
[1] "data.frame"
avector = c()
for(atmp in aframe['a2']) { avector <- atmp }
class(avector)
[1] "numeric"

Nota: Mon vocabulaire ci-dessus est peut-être erroné, veuillez me corriger si c'est le cas. Je suis encore en train d'apprendre le monde de R. De plus, toute explication de ce qui se passe ici est appréciée (par exemple, un lien avec Python ou un autre langage serait utile !)

263voto

joran Points 68079

Je vais essayer d'expliquer cela sans faire d'erreur, mais je parie que cela suscitera une clarification ou deux dans les commentaires.

Un cadre de données est une liste. Lorsque vous sous-ensemblez un cadre de données à l'aide du nom d'une colonne et de [ ce que vous obtenez est un sous-liste (ou un sous cadre de données). Si vous voulez la colonne atomique actuelle, vous pouvez utiliser [[ ou, de façon un peu confuse (pour moi), vous pourriez faire aframe[,2] qui renvoie un vecteur, et non une sous-liste.

Essayez donc d'exécuter cette séquence et peut-être que les choses seront plus claires :

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

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

avector <- aframe[,2]
class(avector)

79voto

Andrew Brēza Points 70

Il existe désormais un moyen simple de le faire en utilisant les services suivants dplyr .

dplyr::pull(aframe, a2)

38voto

James Points 24725

Vous pourriez utiliser $ extraction :

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

ou le double crochet :

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

21voto

Dirk Eddelbuettel Points 134700

Vous n'avez pas besoin as.vector() mais vous avez besoin d'une indexation correcte : avector <- aframe[ , "a2"]

La seule autre chose à savoir est que drop=FALSE option pour [ :

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>

17voto

Vaibhav Sharma Points 1447

Vous pouvez essayer quelque chose comme ça

as.vector(unlist(aframe$a2))

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X