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 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"
Remarque: mon vocabulaire ci-dessus peut être désactivé, veuillez donc me corriger si oui. J'apprends toujours le monde de R. De plus, toute explication de ce qui se passe ici est appréciée (c'est-à-dire se rapportant à Python ou à un autre langage aiderait!)
r
dataframe
vector
type-conversion
Dolan Antenucci
la source
la source
?'[.data.frame'
mènera très loin.Réponses:
Je vais essayer d'expliquer cela sans faire d'erreur, mais je parie que cela attirera une clarification ou deux dans les commentaires.
Un bloc de données est une liste. Lorsque vous sous-ensemble un bloc de données en utilisant le nom d'une colonne et
[
, vous obtenez une sous - liste (ou un sous-bloc de données). Si vous voulez la colonne atomique réelle, vous pouvez utiliser[[
, ou quelque peu déroutant (pour moi), vous pouvez faireaframe[,2]
qui renvoie un vecteur, pas une sous-liste.Alors essayez d'exécuter cette séquence et peut-être que les choses seront plus claires:
la source
aframe[,"a2"]
raison de la possibilité de l'utiliser à la fois avec des trames de données et des matrices et semble obtenir les mêmes résultats - un vecteur.[..., drop = F]
retournera toujours une trame de donnéesdf$x
syntaxe renvoie un vecteur. J'ai utilisé cette syntaxe pendant longtemps, mais quand je devais commencer à utiliserdf['name']
oudf[n]
à récupérer des colonnes, je rencontrais des problèmes lorsque j'essayais de les envoyer à des fonctions qui attendaient des vecteurs. Utiliserdf[[n]]
oudf[['x']]
effacer les choses immédiatement.as.vector
semble - t-il silencieusement n'avoir aucun effet? Cela ne devrait-il pas renvoyer un vecteur ou échouer visiblement?aframe[['a2']]
est très utile avec lessf
objets caraframe[,"a2"]
renvoie deux colonnes car la colonne de géométrie est incluse.Il existe maintenant un moyen simple de le faire en utilisant
dplyr
.la source
Vous pouvez utiliser l'
$
extraction:ou la double équerre:
la source
Vous n'avez pas besoin
as.vector()
, mais vous avez besoin d'une indexation correcte:avector <- aframe[ , "a2"]
L'autre chose à savoir est la
drop=FALSE
possibilité de[
:la source
drop=FALSE
est utile - cela m'aide dans les cas où je peux sélectionner N colonnes à partir d'un data.frame, dans les cas où N = 1.Un autre avantage de l'utilisation 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 souhaitez en extraire une colonne en tant que vecteur, alors
est le meilleur.
la source
Vous pouvez essayer quelque chose comme ça-
la source
identical
.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.la source
la source
la source
J'utilise des listes pour filtrer les dataframes selon qu'elles ont ou non une valeur% dans% a list.
J'avais créé manuellement des listes en exportant un dataframe à 1 colonne vers Excel où j'ajouterais "", autour de chaque élément, avant de coller dans R: list <- c ("el1", "el2", ...) qui était généralement suivi de FilteredData <- subset (Data, Column% in% list).
Après avoir recherché stackoverflow et ne pas avoir trouvé de moyen intuitif de convertir un dataframe à 1 colonne en liste, je publie maintenant ma toute première contribution stackoverflow:
la source
Nous pouvons également convertir les colonnes data.frame de manière générique en un simple vecteur.
as.vector
n'est pas suffisant car il conserve la classe et la structure data.frame, nous devons donc également extraire le premier (et seul) élément:Toutes les solutions suggérées jusqu'à présent nécessitent des titres de colonne codés en dur. Cela les rend non génériques (imaginez appliquer ceci aux arguments de fonction).
Alternativement, vous pouvez bien sûr lire d'abord les noms de colonnes de la colonne, puis les insérer dans le code des autres solutions.
la source