La bonne façon de convertir data.frame en une masortingce numérique, lorsque df contient également des chaînes?

J’ai un bloc de données provenant d’un fichier .csv qui contient des valeurs numériques et des caractères. Je veux convertir ce bloc de données en une masortingce. Toutes les informations contenant des informations sont des nombres (les lignes sans numéro que j’ai supprimées), il devrait donc être possible de convertir le bloc de données en une masortingce numérique. Cependant, je reçois une masortingce de caractères.

J’ai trouvé que le seul moyen de résoudre ce problème était d’utiliser as.numeric pour chaque ligne, mais cela prend du temps. Je suis tout à fait certain qu’il existe un moyen de faire cela avec une sorte de formulaire if(i in 1:n) , mais je ne peux pas comprendre comment cela pourrait fonctionner. Ou est-ce que la seule façon de commencer avec des valeurs numériques, comme proposé ici ( Faire des masortingces numériques et des ordres de nom )?

C’est probablement une chose très facile pour la plupart d’entre vous: P

La masortingce est beaucoup plus grande, ce ne sont que les premières lignes … Voici le code:

 cbind( as.numeric(SFI.Masortingx[ ,1]), as.numeric(SFI.Masortingx[ ,2]), as.numeric(SFI.Masortingx[ ,3]), as.numeric(SFI.Masortingx[ ,4]), as.numeric(SFI.Masortingx[ ,5]), as.numeric(SFI.Masortingx[ ,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!

Edit 2: Voir la réponse de @fodel. Beaucoup mieux

Essayer:

 # assuming SFI is your data.frame as.masortingx(sapply(SFI, as.numeric)) 

Edit: ou comme @ CarlWitthoft suggéré dans les commentaires:

 masortingx(as.numeric(unlist(SFI)),nrow=nrow(SFI)) 
 data.masortingx(SFI) 

De ?data.masortingx :

 Description: Return the masortingx obtained by converting all the variables in a data frame to numeric mode and then binding them together as the columns of a masortingx. Factors and ordered factors are replaced by their internal codes. 

Voici une alternative si le bloc de données ne contient que des nombres.

 apply(as.masortingx.noquote(SFI),2,as.numeric) 

J’ai eu le même problème et je l’ai résolu comme ça, en prenant le bloc de données d’origine sans noms de lignes et en les ajoutant plus tard

 SFIo <- as.matrix(apply(SFI[,-1],2,as.numeric)) row.names(SFIo) <- SFI[,1] 

Une autre façon de le faire est d’utiliser l’argument read.table () colClasses pour spécifier le type de colonne en créant colClasses = c ( types de classe de colonne ). S’il y a 6 colonnes dont vous voulez que les membres soient numériques, vous devez répéter la chaîne de caractères “numérique” six fois séparées par des virgules, en important le bloc de données et as.masortingx () le bloc de données. PS, on dirait que vous avez des en-têtes, alors j’ai mis header = T.

 as.masortingx(read.table(SFI.masortingx,header=T, colClasses=c("numeric","numeric","numeric","numeric","numeric","numeric"), sep=",")) 

J’ai rempli manuellement les AN en exportant le fichier CSV puis en le modifiant et en le réimportant, comme ci-dessous.

Peut-être un de vous experts pourrait-il expliquer pourquoi cette procédure a si bien fonctionné (le premier fichier avait des colonnes avec des données de type char , INT et num (nombres à virgule flottante)), mais à la fin de STEP 3 R correctement reconnu le type de données de chaque colonne).

 # STEP 1: MainOptionFile <- read.csv("XLUopt_XLUstk_v3.csv", header=T, stringsAsFactors=FALSE) #... STEP 2: TestFrame <- subset(MainOptionFile, str_locate(option_symbol,"120616P00034000") > 0) write.csv(TestFrame, file = "TestFrame2.csv") # ... # STEP 3: # I made various amendments to `TestFrame2.csv`, including replacing all missing data cells with appropriate numbers. I then read that amended data frame back into R as follows: XLU_34P_16Jun12 <- read.csv("TestFrame2_v2.csv", header=T,stringsAsFactors=FALSE) 

A son retour dans R, toutes les colonnes ont leurs niveaux de mesure corrects automatiquement reconnus par R!