Bonne façon de convertir des données.cadre numérique de la matrice, lorsque df contient également des chaînes?
J'ai un bloc de données à partir d'une prise de .fichier csv qui contient numérique et les valeurs de caractères. Je veux convertir ce bloc de données dans une matrice. Tous contenant de l'information sont des chiffres (le non-nombre de lignes que j'ai supprimé), il devrait donc être possible de convertir les données d'image en numérique de la matrice. Cependant, je ne obtenir une matrice de caractère.
J'ai trouvé la seule façon de résoudre ce problème est d'utiliser as.numeric
pour chaque ligne, mais cela est assez fastidieux. Je suis tout à fait sûr, il y a un moyen de le faire avec une sorte de if(i in 1:n)
-forme, mais je ne peux pas comprendre comment cela pourrait fonctionner. Ou est le seul moyen vraiment à déjà commencer avec des valeurs numériques, comme proposé ici(Faire de la matrice numérique et le nom des commandes)?
Sans doute, c'est une chose très facile pour la plupart d'entre vous 😛
La matrice est beaucoup plus grand, ce n'est que la première quelques lignes... Voici le code:
cbind(
as.numeric(SFI.Matrix[ ,1]),
as.numeric(SFI.Matrix[ ,2]),
as.numeric(SFI.Matrix[ ,3]),
as.numeric(SFI.Matrix[ ,4]),
as.numeric(SFI.Matrix[ ,5]),
as.numeric(SFI.Matrix[ ,6]))
# to get something like this again:
Social.Assistance Danger.Poverty GINI S80S20 Low.Edu Unemployment
0.147 0.125 0.34 5.5 0.149 0.135 0.18683691
0.258 0.229 0.27 3.8 0.211 0.175 0.22329362
0.207 0.119 0.22 3.1 0.139 0.163 0.07170422
0.219 0.166 0.25 3.6 0.114 0.163 0.03638525
0.278 0.218 0.29 4.1 0.270 0.198 0.27407825
0.288 0.204 0.26 3.6 0.303 0.211 0.22372633
Merci pour toute aide!
- La conversion des nombres stockés en tant que chaînes de caractères de retour à la numerics est trivial. La conversion d'autres chaînes numériques est impossible (à moins qu'ils soient des facteurs, dans ce cas, c'est une terrible pratique, statistiquement). Comme pour les facteurs, vous n'avez pas les mentionner, mais la conversion de facteurs numérique est la seule partie intéressante de cette question.
Vous devez vous connecter pour publier un commentaire.
Edit 2: Voir @flodel de réponse. Beaucoup mieux.
Essayer:
Edit:
ou comme @ CarlWitthoft suggéré dans les commentaires:
matrix(as.numeric(unlist(SFI)),nr=nrows(SFI))
?unlist
aurait une incidence sur le résultat final, mais vous avez peut-être droit, quel que soit l'intermédiaire de la coercition, de la finale de la contrainte deas.numeric
devraient produire les mêmes résultats. De réponses mis à jourDe
?data.matrix
:data.matrix(data.frame(x = "123", stringsAsFactors = FALSE))
. C'est seulement si les données.le cadre contient des facteurs qui ils sont représentés par leur valeur interne (comme cité ci-dessus), essayez dedata.matrix(data.frame(x = "123", stringsAsFactors = TRUE))
. Si tout fonctionne comme je l'espère et comme documenté.stringsAsFactors
ouas.is
pourread.csv
.hopach
, etas.numeric
perd de nouveau les dimensions ...). Je pense que, à cet égard, la documentation n'est pas claire dans que "le mode numérique" comprend également des entiers. Et maintenant que j'y pense, c'est bizarre queas.numeric
retourne toujours un double, qui n'est pas très cohérent, puisque dans tous les autres contextes,numeric
signifieinteger-or-double
...Ici est une alternative si le bloc de données contient uniquement des chiffres.
HTML:
mais le moyen le plus fiable de la conversion d'un bloc de données d'une matrice à l'aide de
data.matrix()
fonction.J'ai eu le même problème et je l'ai résolu comme ça, par
en prenant l'original de la trame de données sans les noms de lignes et de les ajouter plus tard
Une autre façon de le faire est par l'utilisation de la
read.table()
argumentcolClasses
pour spécifier le type de la colonne en faisantcolClasses=c(*column class types*)
.Si il y a 6 colonnes dont les membres que vous souhaitez numérique, vous devez répéter la chaîne de caractères
"numeric"
six fois séparés par des virgules, l'importation de la trame de données, etas.matrix()
la trame de données.P. S. on dirait que vous avez les en-têtes, donc j'ai mis
header=T
.J'ai rempli manuellement NAs par l'exportation au format CSV, puis de l'éditer et de la réimportation, comme ci-dessous.
Peut-être l'un de vous des experts pourrait expliquer pourquoi cette procédure a fonctionné si bien
(le premier dossier avait des colonnes avec des données de types
char
,INT
etnum
(nombres à virgule flottante)), qui sont tous devenuschar
type après l'ÉTAPE 1; mais à la fin de l'ÉTAPE 3 R correctement reconnu le type de données de chaque colonne).Sur l'arrivée de retour dans R, toutes les colonnes avaient leur juste mesure les niveaux reconnus automatiquement par R!
sapply(df[,StringColsToChangeToNumeric], as.numeric)