2016-03-18 5 views
5

Lassen Sie uns sagen, dass ich die folgende Datentabelle haben:Wie kann ich eine data.table umformen, wenn die Reihenfolge der Register die Kategorie bestimmt?

dt=data.table(type=c('big','medium','small','small' 
        ,'medium','small','small' 
        ,'big','medium','small','small') 
      ,category=letters[1:11]) 

     type category 
1: big  a 
2: medium  b 
3: small  c 
4: small  d 
5: medium  e 
6: small  f 
7: small  g 
8: big  h 
9: medium  i 
10: small  j 
11: small  k 

In diesem Fall habe ich eine Kategorie Hierarchie haben: die ‚großen‘ Typ ist das gleiche für alle Zeilen, bis eine folgende ‚großen‘ Art zu sehen ist. Und das Verhalten ist für jeden Typ gleich.

Die reshape Ich will, muss mir folgendes:

dt=data.table(type=c('big','medium','small','small' 
        ,'medium','small','small' 
        ,'big','medium','small','small') 
       ,category=letters[1:11]) 


    big medium small 
1: a  b  c 
2: a  b  d 
3: a  e  f 
4: a  e  g 
5: h  i  j 
6: h  i  k 

Wie Sie jede Kategorie sehen nur ändert, wenn ein Register der gleichen Kategorie zu finden ist, ist die Reihenfolge wichtig ist, diese Kategorien zu setzen.

Denkst du, es gibt einen Weg, dies zu tun, ohne ein für?

Antwort

8

Hier ist ein Ansatz, den Sie verwenden können. Sie werden na.locf von „Zoo“ brauchen:

library(data.table) 
library(zoo) 

Zuerst müssen wir die letzten Zeilen, um herauszufinden. Um dies zu tun, müssen wir explizit definieren, was die Reihenfolge der Typen ist, wie Sie von der gleichen dt starten und andere Ergebnisse erhalten, wenn die Reihenfolge geändert wird (das ist, was der match Teil tut). Sobald Sie die numerische Reihenfolge haben, wenn der Unterschied kleiner oder gleich Null ist, bedeutet, dass es sich um eine neue Zeile in der neuen Tabelle sein wird:

dt[, rid := match(type, c('big', 'medium', 'small'))][, row := cumsum(diff(c(0, rid)) <= 0)] 

Dies ist, was die Daten jetzt aussieht:

dt 
#  type category rid row 
# 1: big  a 1 0 
# 2: medium  b 2 0 
# 3: small  c 3 0 
# 4: small  d 3 1 
# 5: medium  e 2 2 
# 6: small  f 3 2 
# 7: small  g 3 3 
# 8: big  h 1 4 
# 9: medium  i 2 4 
#10: small  j 3 4 
#11: small  k 3 5 

Hier ist es in der Form, die Sie angefordert haben:

na.locf(dcast(dt, row ~ type, value.var = "category")) 
# row big medium small 
# 1: 0 a  b  c 
# 2: 1 a  b  d 
# 3: 2 a  e  f 
# 4: 3 a  e  g 
# 5: 4 h  i  j 
# 6: 5 h  i  k 
+0

Vielen Dank Jungs ...:) ... ich frage mich, wie schaffst du mit diesen Antworten zu kommen, ist es ist Erfahrung oder nur Talent? ... Welche Art von Hintergründen hast du? –

Verwandte Themen