Fonction logique dans le SAS afin de déterminer si une valeur particulière d'une variable est numérique?
J'ai une variable qui est la plupart du temps des valeurs numériques, cependant, il y a parfois un caractère s'est faufilé. À cet effet, la variable est stockée comme un personnage dans le SAS. Je voudrais être en mesure de déterminer si les valeurs de cette variable de caractère sont numériques. Après sachant que les valeurs sont numériques et qui sont de caractère, je voudrais créer un nouveau (numérique) de la variable, où les valeurs numériques de la variable de caractère sont stockées comme des numéros et le caractère, les valeurs sont stockées comme manquant.
Ici est un exemple.
char_var --> num_var
a .
1 1
2.34 2.34
## .
cat .
J'espérais être en mesure de faire quelque chose comme ci-dessous, mais il me manque une fonction pour m'aider:
if char_var=is.numeric(char_var) then num_var=char_var;
else num_var=.;
La is.numeric
serait une fonction qui permettrait de déterminer ce pour moi.
Tout conseil est le bienvenue.
Sur une note de côté, en R je voudrais essayer (peut-être à tort) à un programme comme suit:
mydata$type<-is.numeric(mydata$char_var)
if (mydata$type==1) {mydata$num_var=mydata$char_var} else {mydata$num_var=NA}
mydata$num_var<-as.numeric(mydata$num_var)
OriginalL'auteur user27008 | 2013-06-07
Vous devez vous connecter pour publier un commentaire.
Vous n'avez pas vraiment besoin de trop s'inquiéter à ce sujet; SAS sera heureux de convertir la variable à une variable numérique pour vous. Par exemple:
Mon préféré SAS option (erreurs=0) est utilisé pour supprimer les messages SAS met dans le journal qu'il convertit. Si la valeur du caractère peut être interprétée comme un nombre, la conversion du travail sans problème. Il y a peut être un moyen pour analyser le caractère variable pour voir si elle va entraîner un certain nombre, mais je parie que les frais généraux avec une telle solution "coûte" plus qu'un simple laisser-SAS le faire pour vous.
Tout BTW, l'option "erreurs=0" est un peu trompeur; c'est la même chose que "des erreurs=1" et signifie seulement la première occurrence d'un message d'erreur est écrit dans le journal. J'ai cela dans mon autoexec.sas programme parce que je ne trouve normalement pas besoin de plusieurs des messages d'erreur pour comprendre ce qui ne va pas.
num_var=input(char_var,best32.)
. Cela semble avoir fait ce que je voulais, mais j'ai eu un tas d'erreurs. Sont ces modes interchangeables, ou est la façon dont je me sers maintenant imparfait?À l'aide de la
input
fonction est explicitement fait la même chose (et une bonne fonction à apprendre). Et les messages que vous obtenez ne sont pas vraiment des "erreurs", même s'ils ne réglez l'option ERREUR variable automatique. Le nombre de fois que vous voyez ce message est contrôlée par la SASerrors
valeur de l'option. Je considère que de tels messages importants pour vous informer de la conversion, mais étant donné que dans votre cas, il est prévu, je préfère les ignorer.Désolé Bob, je suis en désaccord sur ce point. SAS ne doit pas automatiquement la conversion entre les types pour vous, il doit rapporter une erreur (pas un avertissement, un message d'erreur). Faisant usage de cette fonctionnalité peut masquer les véritables erreurs non intentionnelles. pragprog.com/the-pragmatic-programmer/extracts/coincidence . Il y a plusieurs façons d'effectuer ce test (voir Joe solution ci-dessous par exemple). Vous pouvez également utiliser la
input()
fonction avec la?
caractère pour le rendre implicite qu'il peut y avoir des caractères inhabituels, puis tester le résultat. Qui permettraient d'atteindre le même but sans avoir à utiliserset errrors=0
.OriginalL'auteur BellevueBob
À l'aide de cet ensemble de données pour tous les exemples:
Il ya beaucoup de façons différentes de ce traitement, en fonction de vos besoins.
Tout d'abord, vous pouvez laisser SAS gère pour vous; Bob offre une telle solution. Je considère cette jolie mauvaise forme, bien que, alors que, dans son programme, il est évident que vous êtes en train de faire sur le but, en plus de code, il n'est pas toujours évident, et donc il peut confondre autres programmeurs et/ou provoquer des erreurs de données. Je n'avais pas permettre au code qui a impliqué intentionnelle de la conversion implicite de le faire à la production sans une bonne raison.
Vous pouvez utiliser l'instruction d'entrée pour faire la conversion, ce qui est une meilleure version de SAS gérer les choses. Dans ce cas, vous pouvez facilement supprimer les messages d'avertissement sur les invalides de conversions. Le premier ?? supprime les erreurs de conversion; un seul ? serait la cause d'une ligne pour l'impression de journal non valide pour les conversions, mais moins obtrusively que pas ?.
Vous pouvez vérifier le champ explicitement; cela dépend beaucoup de vos données. La suivante serait de travailler pour de simples champs numériques, mais échoue sur les deux derniers (avec la notation scientifique), et sur la ligne avec deux décimales.
Vous pouvez également écrire votre propre fonction isnumeric. Celui-ci utilise une expression régulière perl qui est assez robuste (mais pas parfait, et ne comprennent pas beaucoup de numérique valide variétés comme la virgule ou en pourcent; vous pouvez ajouter des personnes dans si vos données ont suggéré de mer).
Pour la plupart des utilisations de la simple entrée avec ?? est probablement suffisant.
OriginalL'auteur Joe