2016-03-29 11 views
3

私はこのようなdata.tableを有する:ベクトル化:ベクトルのベクトルの前に、すべての要素の集合の差異だけを設定するにはどうすればよいですか?

dt=data.table(freq=c(4,3,2,1),elements=list(c('a','b','c'), 
              c('a','d'), 
              c('b','d'), 
              c('b','d','c','e'))) 
    freq elements 
1: 4 a,b,c 
2: 3  a,d 
3: 2  b,d 
4: 1 b,d,c,e 

私はその行の要素とその行の前のセットのすべての要素の関節間の唯一のセットの差が、各行の要素を必要とします。そのようにして、私のようなものになるだろう:私はI-1までそのグループのすべての要素のためにこれを行うと、唯一の差集合を得ることができる

freq elements 
1: 4 a,b,c 
2: 3  d 
3: 2  NA 
4: 1  e 

を私は実際にそれを行う方法を知りたいのですベクトル化された方法で、もし可能であれば。

ありがとう!

+6

どのようにあなたが '手に入れました最後の行では? – akrun

+0

また、ベクトル化されていないソリューションがある場合は、それは何ですか? – Justin

+1

おそらく、各要素と累積組合の設定差異を見つけることができますか?例えば。 'Map(setdiff、dt $ elements、head(Reduce(union、dt $ elements、accumulate = TRUE、init = NULL)、-1L))' –

答えて

8

あなたがdtのあなたの最後の行に「E」を持つことを意味し、そしてfreqが一意である(一意のインデックスを作成し、そうでない場合、または行を使用)と仮定すると:

dt[, .(els = elements[[1]]), by = freq][ 
    , .(freq = freq[1]), by = els][ 
    , .(filtered = list(els)), by = freq][ 
    dt, on = 'freq'] 
# freq filtered elements 
#1: 4 a,b,c a,b,c 
#2: 3  d  a,d 
#3: 2  NULL  b,d 
#4: 1  e b,d,e 
+0

Eddi、本当に良い答えをありがとう、私はちょうど書いたアルゴリズムの流れを理解していません。 –

+0

@AldoParejaそれを段階的に実行してみてください(一度に[]を追加してください) - アイデアは非常にシンプルです - 各要素の最初の周波数(上の2行目)を見つけてください - 残りは好きな形式 – eddi

+0

ああ、私は今それを得る....あなたにそんなにありがとう! –

関連する問題