R: de manière élégante pour déterminer les variables numériques dans un bloc de données
Voici le code que j'utilise pour trouver les variables numériques dans un bloc de données:
Data <- iris
numericvars <- NULL
for (Var in names(Data)) {
if(class(Data[,Var]) == 'integer' | class(Data[,Var]) == 'numeric') {
numericvars <- c(numericvars,Var)
}
}
numericvars
Est-il moins loopy façon de le faire?
Croissante des objets dans une boucle n'est pas (
numericvars <- c(numericvars,Var)
)
OriginalL'auteur Zach | 2011-06-22
Vous devez vous connecter pour publier un commentaire.
C'est assez simple one-liner avec
sapply
:il devrait, selon
?is.numeric
.Endormi au volant, là -- j'ai raté qui vous a transformé le facteur entier.
Je suis difficile; vous devez garder vos yeux sur moi. 😉
Les yeux sur la rondelle, ou les yeux du lecteur?
OriginalL'auteur Joshua Ulrich
C'est un peu plus serré:
Est-il une raison pour
sapply
sur les noms de colonnes et non pas pardata.frame
lui-même?sapply(iris, inherits, c("numeric", "integer"))
OriginalL'auteur Dirk Eddelbuettel
Il y a aussi
colwise()
,numcolwise()
etcatcolwise()
dans plyr.colwise()
transforme une fonction qui fonctionne sur la base d'un vecteur dans une fonction qui fonctionne selon les colonnes sur un dataframe.numcolwise
etcatcolwise
fournir des versions qui fonctionnent uniquement sur le numérique et les variables discrètes, respectivement.OriginalL'auteur Chase
L'utilisation de
sapply()
oulapply()
semble logique ici:qui donne:
Intéressant de noter que, dans votre boucle, vous êtes à la croissance de la
numericvars
vecteur à chaque itération de la boucle; dans R, qui est un gros no-no! C'forces R pour copier et développez le vecteur à chaque fois. Allouer suffisamment de stockage avant de la main et de remplir l'objectif, ici, qui implique la création d'numericvars
commepuis dans la boucle faire
Un peu plus de travail, mais beaucoup plus efficace, si vous ne voyez que quand le nombre d'itérations devient plus grande.
OriginalL'auteur Gavin Simpson