web-dev-qa-db-fra.com

Convertir la colonne data.frame en un vecteur?

J'ai un dataframe 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 l'une des colonnes en un vecteur, mais cela ne fonctionne pas:

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

C'est la seule solution que je pourrais trouver, mais je suppose qu'il doit y avoir une meilleure façon de le faire:

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

Note: Mon vocabulaire ci-dessus est peut-être désactivé, donc corrigez-moi si c'est le cas. J'apprends toujours le monde de R. De plus, toute explication de ce qui se passe ici est appréciée (c'est-à-dire liée à Python ou à une autre langue qui aiderait!)

134
Dolan Antenucci

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

Une trame de données est une liste. Lorsque vous sous-définissez un cadre de données en utilisant le nom d'une colonne et de [, vous obtenez un sous-liste (ou un sous-cadre de données). Si vous voulez la colonne atomique réelle, vous pouvez utiliser [[, ou un peu déroutant (pour moi), vous pouvez faire aframe[,2] qui renvoie un vecteur, pas une sous-liste.

Alors essayez de lancer 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)
181
joran

Vous pouvez utiliser l'extraction $:

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

ou le double crochet:

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

Vous n'avez pas besoin de as.vector(), mais vous avez besoin d'un indexage correct: avector <- aframe[ , "a2"]

L’autre élément à prendre en compte est l’option drop=FALSE de [:

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> 
19
Dirk Eddelbuettel

Il existe maintenant un moyen facile de faire cela en utilisant dplyr.

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

Un autre avantage de l’opérateur '[[' est qu’il fonctionne à la fois avec data.frame et data.table. Donc, si la fonction doit être exécutée à la fois pour data.frame et data.table et que vous voulez en extraire une colonne en tant que vecteur,

data[["column_name"]] 

est le meilleur.

8
joel.wilson

Vous pouvez essayer quelque chose comme ça-

as.vector(unlist(aframe$a2))
5
Vaibhav Sharma

Si vous utilisez simplement l'opérateur d'extraction, cela fonctionnera. Par défaut, [] définit l'option drop=TRUE, ce que vous voulez ici. Voir ?'[' pour plus de détails.

>  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"
4
Ari B. Friedman
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"
2
shubham ranjan

J'utilise des listes pour filtrer les images selon qu'elles ont ou non une valeur% dans% une liste.

J'avais créé manuellement des listes en exportant un fichier de données d'une colonne vers Excel où j'ajoutais "" autour de chaque élément, avant de coller dans R: list <- c ("el1", "el2", ...) qui était généralement suivi de FilteredData <- sous-ensemble (Data, Column% in% list).

Après avoir recherché stackoverflow et ne pas avoir trouvé un moyen intuitif de convertir un bloc de données à une colonne en une liste, je publie maintenant ma toute première contribution de stackoverflow:

# 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")
1
Adrian DSouza