2017-12-19 12 views
1

2つのデータカテゴリ間で連続変数に基づいてデータフレームをソートしようとしています。具体的には、連続変数をソート(降順)したいが、同じタイプの変数をまとめて保存したい。ここに例があります:split-apply-combine:複数の変数をソートしてグループ化するR

pets <- data.frame(animal = c("dog", "dog", "dog", "cat", "cat", "fish", "fish", "fish"), 
     breed = c("retriever", "husky", "husky", "grey", "white", "guppy", "betta", "betta"), 
     count = c(4, 3, 7, 8, 9, 2, 12, 1)) 

今、データフレームはソートされていません。最高の平均値がcountbreedsが最初に表示されるようにソートしますが、すべてbreed(およびanimal秒)はまとめてグループ化されています。 breedに基づいてフレームを注文すると、countの正しい順序が失われ、逆も同様です。両方とも試してみても、

pets[with(pets, order(breed, -count)), ] 

出力が正しくソートされません。私はsplit-apply-combine tutorialsを調べましたが、私のデータにあるように2つではなく、1つのグループのデータをまとめて保存しようとしたものだけが見つかりました。

は今のところ、これは私が持っている最高のされています

split_pets <- split(pets, pets$animal) 
    unlist(lapply(split_pets, function(x) sort(with(x, tapply(count, breed, mean)), decreasing = TRUE))) 

cat.white  cat.grey  dog.husky dog.retriever fish.betta fish.guppy 
     9.0   8.0   5.0   4.0   6.5   2.0 

確かに返すには、私は彼らが行く正しい順序を持っている。しかし、私にはありません。実際には手段を気にして、私はちょうどこれに基づいてデータフレームを並べ替える必要があります。次は、品種に基づいてこれを再び分割するウサギの穴が塞がっていますが、リストのリストのデータフレームの列に基づいてソートしています。それはあまりにも複雑に聞こえる。私もorderを試してみたのですが、group_by()からdplyrにそれを配管しましたが、今まで以上に私を得ることはできませんでした。

ありがとうございました!

答えて

1

グループを最初にソートしてから、意図した順序で元のセットに戻すことができます。

pets <- data.frame(
    animal = c("dog", "dog", "dog", "cat", "cat", "fish", "fish", "fish"), 
    breed = c("retriever", "husky", "husky", "grey", "white", "guppy", "betta", "betta"), 
    count = c(4, 3, 7, 8, 9, 2, 12, 1), 
    stringsAsFactors = FALSE 
) 

library(dplyr) 

pets %>% 
    group_by(animal, breed) %>% 
    summarise(avg = mean(count)) %>% 
    right_join(pets, by = c("animal", "breed")) %>% 
    arrange(animal, desc(avg), desc(count)) %>% 
    select(-avg) %>% 
    ungroup 

# # A tibble: 8 x 3 
# animal  breed count 
# <chr>  <chr> <dbl> 
# 1 cat  white  9 
# 2 cat  grey  8 
# 3 dog  husky  7 
# 4 dog  husky  3 
# 5 dog retriever  4 
# 6 fish  betta 12 
# 7 fish  betta  1 
# 8 fish  guppy  2 
+0

このソリューションは、私がいたソリューションパスよりもはるかにエレガントです。しかし、この正確なコードを実行すると、エラーが発生します。 'エラー:'によって 'LHS' 行に行方不明の「動物」、「品種」が含まれていませんright_join()に来てください – AcademicDialysis

+0

私の最後のコメントのバグを解決しました。問題は、 'plyr'が自分のネームスペースに' dplyr'の前にロードされ、 'group_by'から出てきたグループごとに1つではなく、ただ一つの平均で' summary'結果が得られたということでした。ここでそれにつまずいた:https://stackoverflow.com/questions/26923862/why-are-my-dplyr-group-by-summarize-not-working-properly-name-collision-with – AcademicDialysis

関連する問題