2013-07-15 9 views
7

私は、顧客IDとリストを含むデータフレームを持っています。 同じ顧客に関するリストをマージしたいと思います。リストの和集合を作成するためのddply

library(plyr) 
subsets <- list(c("a", "d", "e"), c("a", "b", "c", "e")) 
customerids <- c(1,1) 
transactions <- data.frame(customerid = customerids,subset =I(subsets)) 
> transactions 
    customerid  subset 
1   1 a, d, e 
2   1 a, b, c, e 

私はddplyでサブセットをマージしたい場合は、私が1行のすべての結果を期待しているだろうが、私は、拡張結果

> ddply(transactions, .(customerid), summarise, subset=Reduce(union,subset)) 
    customerid subset 
1   1 a 
2   1 d 
3   1 e 
4   1 b 
5   1 c 

を取得します。

+1

データフレームを作成する段階でエラーが発生します。これはおそらくこれを別に作成し、 'dput(transactions)'を投稿する必要があります。私はデータフレームがリストオブジェクトを非常にうまく保持しているとは思わない。データフレームにもPOSIXltオブジェクトのよく知られた問題があります。 –

+0

確かに間違った入力(I演算子なし)がコピーされましたが、これは修正されています。 – nicolas

+0

「I」はdata.frame内のリスト要素を作成するために+1します。 – agstudy

答えて

4

あなたはこのような何かを行うことができます。

ddply(transactions, .(customerid), function(x) 
      data.frame(subset=I(list(unlist(x$subset))))) 

編集を:私はあなたの意見に従うかわかりません。あなたはその後、subsetため、各customerid内だけで一意の値をしたい場合しかし:

ddply(transactions, .(customerid), function(x) 
      data.frame(subset=I(list(unique(unlist(x$subset)))))) 
+0

良いことを知っています。 ddplyの実装を見ると理にかなっています – nicolas

+0

実際には、unionは重複しないので、 'list'は参照のために '一意'でなければなりません。ありがとう! – nicolas

+0

実際には、この単純な変更は簡単ではないようです...だからマークを削除しなければなりません。 – nicolas