2017-12-22 19 views
-3

グループに基づいて個々のエントリを1列に並べるにはどのようにdplyrを使いますか? 私はgroup_by電子メールで、それぞれの列A〜Zを並べ替えることができましたが、データフレーム全体を並べ替えることなくこれを行う方法を理解することはできません。 ありがとうございました!グループ化した後に1列だけを並べ替える

サンプルデータ

df <- data.frame(
    cleanname = c("Steven Smith", "Rob Tan", 'Zachary', "Matthew"), 
    dirtyname = c('rob Tan', 'stevesmith','zach', "Matthew"), 
    email = c('[email protected]', '[email protected]', '[email protected]', '[email protected]') 
) 

所望の最終結果

desireddf <- data.frame(
    cleanname = c("Rob Tan", "Steven Smith", "Zachary", "Matthew"), 
    dirtyname = c('rob Tan', 'stevesmith','zach', 'Matthew'), 
    email = c('[email protected]', '[email protected]', '[email protected]', '[email protected]') 
) 

編集

私の問題は、ファジーによって解決することができることを指摘しソトスに感謝名前の一致。

+3

注文の論理を説明できますか?なぜ「マシュー」が最後ですか? – PoGibas

+0

本当に手配してもよろしいですか?それはあなたがそこにあいまいな一致のいくつかの並べ替えを必要とするかもしれないようだ – Sotos

+0

こんにちは@PoGibas、順序に論理がありません。状況の要点は、AはBと並んでおり、BはAと並んでいるということです。また、3人の異なる人がいる状況もあります。したがって、A-B、B-C、C-Aのマッチングがあります。 – maria

答えて

0

データフレーム内の行が明確な観測値を表している場合、独立したベクトルソートで行が個々の観測値を表さなくなるため、各列を独立にソートするのは適切ではありません。

ベクトルは、order()関数など、多くの方法でソートできます。

dirtyname <- dirtyname[order(dirtyname)] 
+0

これはどのように答えですか?これは、単にそれについてコメントしている問題を解決しません。 – PoGibas

+0

こんにちは、希望のデータフレームの行は明確な観測ではありませんが、コンパイルの過程で、同じ電子メールアドレスを持つため、指定されたダーティデータフレームには2つの名前が混在しています。 – maria

+0

@PoGibas - 終了する前に 'post'ボタンを押しました。 –

1

あなたはstringdist -packageからamatch -functionを使用することができます。

library(stringdist) 
df %>% 
    mutate(dirtyname = dirtyname[amatch(tolower(cleanname), tolower(dirtyname), maxDist = 3)], 
     email = email[amatch(tolower(cleanname), tolower(dirtyname), maxDist = 3)]) 

与える:

 cleanname dirtyname   email 
1 Steven Smith stevesmith [email protected] 
2  Rob Tan rob Tan [email protected] 
3  Zachary  zach [email protected] 
4  Matthew Matthew [email protected] 

data.tableに適用したのと同じロジック:

library(data.table) 
setDT(df)[, `:=` (dirtyname = dirtyname[amatch(tolower(cleanname), tolower(dirtyname), maxDist = 3)], 
        email = email[amatch(tolower(cleanname), tolower(dirtyname), maxDist = 3)])] 
関連する問題