2017-02-17 10 views
1

私の質問は、2つのデータセットをマージするという問題と組み合わされた、「コンビーン」関数のようなものを構築するための迅速かつ効率的な方法です。私のデータは、おおよそ次のようになります。サブセットとコンビネーションを効率的に組み合わせる

DF <- data.frame(c(1, 1, 1, 2), c("A", "B", "C", "A")) 
colnames(DF) <- c("ID", "Classification") 
DF 
    ID Classification 
1 1    A 
2 1    B 
3 1    C 
4 2    A 
M <- matrix(data=c(1, 2, 3, 2, 4, 5, 3, 5, 6), nrow=3, ncol=3) 
colnames(M) <- c("A", "B", "C") 
rownames(M) <- c("A", "B", "C") 
M 
    A B C 
A 1 4 7 
B 2 5 8 
C 3 6 9 

私は最後にしたい結果は、この(またはまだClassification1Classification2変数を含めずに、私は気にしない)である:だから

RESULT <- data.frame(c(1, 1, 1, 1, 1, 1, 2), c("A", "A", "A", "B", "B", "C", "A"), 
        c("A", "B", "C", "B", "C", "C", NA), c(1, 2, 3, 4, 5, 6, NA)) 
colnames(RESULT) <- c("ID", "Classification1", "Classification2", "Value") 
RESULT 
    ID Classification1 Classification2 Value 
1 1    A    A  1 
2 1    A    B  2 
3 1    A    C  3 
4 1    B    B  4 
5 1    B    C  5 
6 1    C    C  6 
7 2    A   <NA> NA 

本質的に私はRに何かを伝えたいと思います:IDのそれぞれのユニークな値に対して、Classificationのすべての可能なバイナリの組み合わせを作成します。これらの可能な組み合わせのそれぞれについて、対応する値を参照してMを返します。data.frameIDおよびvaluesのそれぞれのリスト。

私は長い形式に expand.gridまたは最初の部分のための combn、その後、 melt行列 Mに基づいて自分自身の関数を書く試みた

、およびClassification変数に基づいてmerge。それには、subsetmerge、そしてrbindという数多くのものがありました。私はlapplyを使ってみましたが、私はその作業をすることができません。私の気持ちは、data.tableでスマートな方法があるかもしれないということですが、私はその作業を行うこともできません。

ご協力いただきまして誠にありがとうございます。あなたが行列を操作する関数を生成することから始めることができ

ニルス

答えて

0

は:

matrix.gather <- reshape2:::melt.matrix 
matrix.gather(M)->k 

これはあなたの行列の行と列の組み合わせを提供します。

> k 
    Var1 Var2 value 
1 A A  1 
2 B A  2 
3 C A  3 
4 A B  2 
5 B B  4 
6 C B  5 
7 A C  3 
8 B C  5 
9 C C  6 

あなたはそのようにのようなDFbyClassificationmergekにしたいことがあります。他の回答とほぼ同じロジック

merge(k,DF,by="Classification") 

    Classification Var2 value ID 
1    A A  1 1 
2    A A  1 2 
3    A C  3 1 
4    A C  3 2 
5    A B  2 1 
6    A B  2 2 
7    B A  2 1 
8    B B  4 1 
9    B C  5 1 
10    C B  5 1 
11    C A  3 1 
12    C C  6 1 
+0

ありがとうございました。しかし、マージする前に組み合わせを制限したいので、あなたの例のようにすべてのマッチが作成されるわけではありません。 ID = 2の行にはClassificationが1つしかないので、1つの分類のバイナリ展開がないので、ここでNAを指定します。また、@thelatemailの答えで指摘されているように、私は単一の分類(AとBをマージ)ではなく、分類のペア(A-BとA-B)をマージしたいと思います。 –

0

、私はこれは、より適切にグループ内の組み合わせを制限だと思います。

merge(
    merge(DF, DF, by="ID"), 
    as.data.frame(as.table(M), responseName="Value"), 
    by.x=2:3, by.y=1:2 
) 

# Classification.x Classification.y ID Value 
#1     A    A 1  1 
#2     A    A 2  1 
#3     A    B 1  2 
#4     A    C 1  3 
#5     B    A 1  2 
#6     B    B 1  4 
#7     B    C 1  5 
#8     C    A 1  3 
#9     C    B 1  5 
#10    C    C 1  6 
+0

ありがとうございます。これはほとんど私が望むことをするようです。 (a)分類(ID = 2のように)に値が1つしかない場合は値をNAにし、さらに重要なことは分類の順序は重要ではないことをRに伝えるために、分類ABはBAと同じですので、マージ操作中にID = 1に対して6つしか一致しません。行列 'M'は対称的なので、同じ数値を与えますが、重複を避けたいのです。 –

関連する問題