2016-03-18 18 views
5

のは、私は次のようなデータテーブルがあるとしましょう:以下の「大きな」タイプが見られるまで、「大きな」タイプは、すべての行で同じである:私はカテゴリ階層を持っている。この場合レジスタの順序でカテゴリが決定された場合、data.tableをどのように変更できますか?

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 

。そして行動はすべてのタイプで同じです。

私は次のように私を与える必要がありますしたいリシェイプ:あなただけは、同じカテゴリのレジスタが発見された場合、順序はこのカテゴリを設定することが重要である変更する各カテゴリを見ることができるように

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 

forを使用せずにこれを行う方法があると思いますか?

答えて

8

ここでは、使用できるアプローチがあります。あなたが「動物園」からna.locfをする必要があります:

library(data.table) 
library(zoo) 

まず、我々は最終行を把握する必要があります。これを行うには、同じdtから始まり、注文が変更された場合(つまり、matchの場合)異なる結果を得ることができるので、タイプの順番を明示的に定義する必要があります。あなたは数字の順序を持​​っていたら、diffは新しいテーブルに新しい行になるだろうことを意味し、ゼロ以下であれば、:

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

これは、データが今のようになります。

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 

ここで、それはあなたが要求してきた形である:

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

はそんなにみんなありがとう...!)...私はあなたがそれらの答えを思い付くために管理しない方法だろう、さ経験や才能が好きですか?...あなたはどんな背景を持っていますか? –

関連する問題