2010-05-24 6 views
1

J'ai une ligne dans une trame de données dans R qui est composée de séquences de longueur indéterminée 0s 1s et 2s en tant que caractères. Donc "01", "010", "201", "102", "00012" ... des choses comme ça.Remplacement d'éléments dans une chaîne dans R

Je voudrais trouver un moyen de déterminer si le dernier caractère de la chaîne est NUMÉRIQUEMENT le plus grand. Il est important que je garde la ligne dans le bloc de données en tant que caractères à d'autres fins. Donc, fondamentalement, je veux prendre substr (x, nchar (x), nchar (x)) et déterminer si, en tant que nombre, est le plus grand des nombres dans la chaîne de caractères. Je suis super perdu sur la façon de faire cela, car je ne suis pas très familier avec les expressions régulières et je dois alterner entre le traitement des éléments comme des caractères et des nombres.

Merci d'avance.

~ Maureen

Répondre

0

Le regex serait [0-9] $ pour obtenir le dernier numéro, le reste de la logique dépend de l'environnement que vous développez dans.

1

Une façon serait

p <- as.numeric(strsplit("0120102","")[[1]]) 
if (max(p) == p[length(p)]) { 
    print("yes") 
} 

En fait, vous pouvez ignorer as.numeric() depuis "2"> "1"> "0":

p <- strsplit("0120102", "")[[1]] 

Si vous voulu appliquer à votre data.frame A:

apply(A, c(1,2), function(z) {p<-strsplit(z, "")[[1]];(max(p) == p[length(p)])}) 
7

Laissez df être le nom de la trame de données et la ligne avec les séquences de chaîne « 01 », « 010 », « 201 », « 102 », " 00012 "est n ° 2. Vous pouvez obtenir un vecteur qui répond à la question si le dernier caractère de la chaîne est le plus important numériquement donnant ceci:

sapply(strsplit(as.character(df[2,]),""),function(x) x[length(x)] >= max(x)) 
[1] TRUE FALSE FALSE TRUE TRUE 
+0

Vous êtes mon héros. Cela fonctionne parfaitement. Merci! :) – Maureen

0

Je pense que vous êtes le meilleur pari sera de voir comment fonctionne regex dans la langue R:

http://www.regular-expressions.info/rlanguage.html 

comme Dan Heberden dit dans le post ci-dessus, vous aurez besoin de tokenizer la chaîne que vous avez donné à titre d'exemple dans votre poste, puis grep (...?) les jetons pour l'expression rationnelle « [0 -9] $ ". En passant, avec regex, vous pouvez tout traiter comme des caractères, donc vous ne devriez pas avoir à faire la navette entre le mode numérique et le mode caractère, sauf lorsque vous prenez les résultats de la fonction grep et l'analyser en forme numérique pour votre Comparaison.