2017-07-10 14 views
0

Paste multiple columns togetherスレッドのように、複数の列を組み合わせて1つの「グループ化」変数を取得する必要があります。問題は、弦の似たようなコンテンツに堅牢にしたいということです。上記のようなデータについて列を組み合わせて一意性を保持する

tmp1 <- data.frame(V1 = c("a", "aa", "a", "b", "bb", "aa"), 
        V2 = c("a", "a", "aa", "b", "b", "a")) 

tmp2 <- data.frame(V1 = c("+", "++", "+-", "-|", "||"), 
        V2 = c("-|", "--", "++", "|-+", "|")) 

それは出力の列は識別不能になるだろうと一緒に列の異なる種類の混合をもたらし得るように、""|-+ようないくつかの共通のセパレータと機能apply(x, 1, paste, collapse = sep)を使用して失敗します。

カラムは異なるタイプ(数値、因子、文字など)であると仮定できます。

予想される出力は、行ごとに1つのIDを持つベクトルで、各IDは2つの列間の一意の値の組み合わせに割り当てられます。 IDの実際の形式は私にとって重要ではありません。例えば、tmp1データ用

1 2 3 4 5 2 

この方法をお勧めしますか?私はパフォーマンスに関心があることに注意してください。

+1

予想される出力は – akrun

+0

です@akrunこのような情報を追加するために編集しました – Tim

+0

まだ明確ではありません。あなたのデータセットにない 'sep'パラメータの値を選ぶだけでいいですか? 'paste(c(" a "、" b "、" ++ ")、collapse =" -mycollapsestring ")' '" a-mycollapsestring-b-mycollapsestring-++ "' –

答えて

1

あなたの質問へのアップデートに基づいて、IDが重要でないフォームがあれば、これは簡単です。ここではdata.tableを使用する方法ですが、dplyrと同様にすることができます。

library(data.table) 

merge(tmp1, 
     unique(tmp1)[, .(V1, V2, ID = 1:.N)], 
     by = c("V1", "V2")) 

    V1 V2 ID 
1: a a 1 
2: a aa 3 
3: aa a 2 
4: aa a 2 
5: b b 4 
6: bb b 5 

のみ固有の組合せマージサブセットの第二パラメータと、各一意の行に一意の値を割り当て、その後、マージがフルデータセットにそれを戻します。

関連する問題