2013-06-13 12 views
6

Ich habe einige Daten:eine Säule aus Reihen hinzufügen

test <- data.frame(A=c("aaabbb", 
"aaaabb", 
"aaaabb", 
"aaaaab", 
"bbbaaa") 
) 

und so weiter. Alle Elemente haben die gleiche Länge und sind bereits sortiert, bevor ich sie bekomme.

Ich muss eine neue Spalte der Ränge machen, "First", "Second", "Third", alles danach kann leer gelassen werden, und es muss Verbindungen berücksichtigen. So im obigen Fall, würde Ich mag die folgende Ausgabe erhalten:

A  B 
aaabbb First 
aaaabb Second 
aaaabb Second 
aaaaab Third 
bbbaaa 
bbbbaa 

ich auf Rang sah() und einigen anderen Stellen, die es verwendet, aber ich war nicht in der Lage zu bekommen, um zu tun, was ich war auf der Suche nach.

Antwort

3

Wie wäre es damit:

test$B <- match(test$A , unique(test$A)[1:3]) 
test 
     A B 
1 aaabbb 1 
2 aaaabb 2 
3 aaaabb 2 
4 aaaaab 3 
5 bbbaaa NA 
6 bbbbaa NA 

Eine von vielen Möglichkeiten, dies zu tun. Möglicherweise nicht die beste, aber eine, die leicht in den Sinn kommt und ist ziemlich intuitiv. Sie können unique verwenden, weil Sie die Daten vorsortiert erhalten.

Als Daten eine andere geeignete Funktion Wert sortiert erwägt ist rle, obwohl es in diesem Beispiel etwas stumpfer ist:

rnk <- rle(as.integer(df$A))$lengths 
rnk 
# [1] 1 2 1 1 1 
test$B <- c(rep(1:3 , times = rnk[1:3]) , rep(NA, sum(rnk[-c(1:3)]))) 

rle berechnet die Längen (und Werte, die wir hier nicht wirklich interessieren) von Läuft gleiche Werte in einem Vektor - so funktioniert das auch, weil Ihre Daten bereits sortiert sind.

Und wenn Sie dies nicht tun haben Rohlinge nach dem dritten Platz Element zu haben, es ist noch einfacher (und besser lesbar):

test$B <- rep(1:length(rnk),times=rnk) 
+0

Ich weiß nicht, ich denke, das ist verdammt gut. – thelatemail

+0

@thelatemail lol, Prost. Ich denke schon. Ich habe auch über 'rle' nachgedacht, da die Daten sortiert sind. Scheint angebracht, also werde ich es als eine Alternative hinzufügen. –

+0

Genau das habe ich gesucht. Vielen Dank! – pak

3

Dies scheint eine gute Anwendung für Faktoren:

test$B <- as.numeric(factor(test$A, levels = unique(test$A))) 

cumsum kommt auch in dem Sinne, wo wir 1 jedesmal, wenn die Wertänderungen hinzu:

(Wie @Simon sagte, gibt es viele Möglichkeiten, dies zu tun ...)

+0

+1 für die Offsetmethode Köpfe und Schwänze. Klug. –

+1

Das ist auch nützlich, vor allem wenn alles geordnet werden muss. In diesem speziellen Fall war es nur die Top 3. Danke. Manchmal finde ich es großartig, dass es so viele Möglichkeiten gibt, Dinge zu tun, und manchmal bringt es mich dazu, meine Haare anzünden zu wollen. – pak

+0

@ flodel. Ich habe Ihre erste Antwort (unter Verwendung von Faktoren) auf einige meiner Daten getestet und festgestellt, dass sie nicht in allen Fällen korrekt funktioniert. Dies liegt daran, dass es möglich ist, beispielsweise $ A [10] so zu testen **, als ob es gleich $ A [6] wäre, wobei die Zwischenelemente unterschiedlich wären. Wenn man sie als Faktoren behandelt, erzwingt sie Gleichheit, wo es in diesem Fall nicht sein mag. – pak

Verwandte Themen