2016-12-08 10 views
2

DPLYRを使用して次のタスクを完了するためのよりコンパクトな方法があるかどうかを確認したいと思います。DPLYRから指定された変数への結果を

id name value average max min 
1 chris 8   
1 chris 5   
1 chris 3   
1     
1   2   
2 tom  12   
2 tom  6   
2 tom  4   
2 tom    
2     

これに:

id name value average max min 
1 chris 8  4.5  8 2 
1 chris 5  4.5  8 2 
1 chris 3  4.5  8 2 
1     4.5  8 2 
1   2  4.5  8 2 
2 tom  12  7.3  12 4 
2 tom  6  7.3  12 4 
2 tom  4  7.3  12 4 
2 tom    7.3  12 4 
2     7.3  12 4 

値はIDごとにグループ化されて、私はこれから行きたいです。今、私は、次の一連のコマンドを実行します。

ステップ1:idで平均を取り、新しいDFを作成します。

library(dplyr) 
new_df <- df %>% 
    group_by(id) %>% 
    summarise_each(funs(mean(value, na.rm=TRUE))) 

ステップ2:new_df

で平均を除くすべての変数を削除

ステップ3:new_dfをマスタにマージする

DPLYRの結果をIDに基づいた変数に直接送る方法はありますか?ありがとうございました。

おそらく、このような新しいコード

df <- df %>% 
    group_by(id) %>% 
    mutate_each(funs(average = mean(value, na.rm = TRUE), 
        min = min(value, na.rm = TRUE), 
        max = max(value, na.rm = TRUE))) 

データフレームコード

id = c(1, 1, 1, 1, 1, 2, 2, 2, 2, 2) 
name = c("chris", "chris", "chris", "", "", "tom","tom","tom","tom","") 
value = c(8,5,3,"",2,12,6,4,"","") 
average = c(1:10) 
max = c("","","","","","","","","","") 
min = c("","","","","","","","","","") 
df = data.frame(id, name, value, average, max, min) 
+0

[再生可能なフォーマット](http://stackoverflow.com/questions/5963269/how-to-make-a-great-r-reproducible-example)でデータを共有してください。これらの空白の値が何を表しているのかは不明です。彼らはNAですか?またはスペース?または長さゼロの文字列? – MrFlick

+1

こんにちは@MrFlick、上記のデータフレームコードを追加しました。ありがとうございました。 – DCRubyHound

答えて

3

ファクタトラップを回避するには、ティブルラッパーdata_frameを使用してデータフレームを構築します。 列は「」の存在に起因して入力された文字であるため

df = data_frame(id, name, value, average, max, min) 

は、それが数値にオンにする必要があります。幸いなことに、これもあなたのNAをNAに変えます。 (1ステップで)突然変異/要約フレンドリーna.omit()の計算からNAを除外します。

df1 <- 
    select(df, id, value) %>% 
    mutate(value = as.numeric(value)) %>% 
    na.omit %>% 
    group_by(id) %>% 
    summarise(average = mean(value), 
       max = max(value), 
       min = min(value) 
      ) %>% 
    right_join(select(df, id, name, value), .) 

> df1 
# A tibble: 10 × 6 
     id name value average max min 
    <dbl> <chr> <chr> <dbl> <dbl> <dbl> 
1  1 chris  8 4.500000  8  2 
2  1 chris  5 4.500000  8  2 
3  1 chris  3 4.500000  8  2 
4  1    4.500000  8  2 
5  1   2 4.500000  8  2 
6  2 tom 12 7.333333 12  4 
7  2 tom  6 7.333333 12  4 
8  2 tom  4 7.333333 12  4 
9  2 tom  7.333333 12  4 
10  2    7.333333 12  4 
+0

これは完全に働いた、ありがとう@leerssej !! :) – DCRubyHound

+0

私の喜び!挑戦する楽しみ、そして喜んで助けてください! :-D –

+0

@leerseej。あなたのための簡単な質問。ほとんどの場合、このコードは完璧に動作しますが、しばらくの間、次のエラーメッセージが表示されます。一般的な変数はありません。 'by'パラメータを指定してください。 Rを再起動してコードを再実行すると、エラーは発生しません。どのようにこのエラーを避けるためにどのようなアイデア? – DCRubyHound

4

library(dplyr) 
df <- df %>% 
    group_by(id) %>% 
    mutate(average = mean(value, na.rm = TRUE), 
     min = min(value, na.rm = TRUE), 
     max = max(value, na.rm = TRUE)) 
+0

ありがとう、@Wojciech。これは右の列に値を取得しますが、グループIDではなくすべての値に基づいて計算が行われます。 – DCRubyHound

+0

入力データをコピーしてコードを実行すると、希望の出力が得られます –

+0

ありがとう、@wojciech。私はあなたのコードをもう2回試してみましたが、2つの異なるID(1と2)ではなく、すべての値に対して平均、最小値、最大値を報告するだけです。いくつかの試行錯誤を通して私は何が間違っているのか分かりました(少なくとも私の最後で)、mutate_eachを追加すると、グループごとに計算が分割されますが、その過程で多くの新しい変数が作成されます。割り当てられた3つの列に結果を公開するための新しいコード(上記)の入手方法ありがとうございました。 – DCRubyHound

0

方法について:

library(dplyr) 
df %>% 
    group_by(id) %>% 
    mutate(average = mean(value, na.rm = TRUE), 
     min = min(value, na.rm = TRUE), 
     max = max(value, na.rm = TRUE)) %>% 
    left_join(df) 
関連する問題