2016-03-18 17 views
5

ı aşağıdaki veri tablosu var diyelim: Bir aşağıdaki 'büyük' ​​türü görülür kadar 'büyük' ​​türü tüm satırlar için aynıdır: Bir kategori hiyerarşisi var Bu durumdaKayıtların sırası kategoriyi belirlediğinde bir data.table nasıl yeniden şekillendirebilirim?

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 

. Ve davranış her tür için aynıdır.

aşağıdaki bana vermelidir istediğiniz yeniden şekillendirme: Yalnızca aynı kategorideki bir kayıt bulunduğunda, sipariş bu kategoriler ayarlamak önemlidir değiştiren her kategoriyi görebileceğiniz gibi

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 

.

Bunu kullanmaksızın kullanmanın bir yolu olduğunu düşünüyor musunuz?

cevap

8

Kullanabileceğiniz bir yaklaşım. Sen "hayvanat bahçesi" dan na.locf gerekir:

library(data.table) 
library(zoo) 

İlk olarak, nihai satırları anlamaya ihtiyacımız var. Bunu yapmak için, aynı dt'dan başlayabileceğiniz ve sipariş değiştiyse (match bölümünün yaptığı gibi) farklı sonuçlar elde edebileceğiniz gibi, türlerin sırasının açık bir şekilde tanımlanması gerekir.

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

Bu veriler artık neye benzediği:

sayısal emir aldıktan sonra fark sıfıra eşit veya daha az olması durumunda, bu yeni tabloda yeni bir satır olacak demektir İşte
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 

o halde İstediğiniz edilir:

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

seni çok sağolun ...:!) ... Ben merak o cevapları ile gelip yönetmek yapmak olduğunu Tecrübe mi yoksa sadece yetenek mi? ... ... nasıl bir arka planın var? –

İlgili konular