2017-05-26 12 views
2

Okeyは、dplyrカンニングシートで何時間も見つめた後、ついにここで私の質問を諦めています。NAを他の列の最大ファクタカウントで置き換えます。

私はこの形式でデータを持っている:

ID Material Supplier 
1  a   01 
2  b   02 
3  NA   01 
4  NA   02 
4  a   02 
4  b   02 

は今、私は業者によってグループ化された最も一般的な材料でNASに置き換えたいです。私はこのコードを使って最も一般的なマテリアルを数え、データフレームにカウントを入れますが、同時に置換を行いたいのです。事前に

b <- a[which(!is.na(a$material)),] %>% 
       group_by(supplier, material) %>% 
       summarise(n = n()) %>% 
       group_by(supplier) %>% 
       filter(n == max(n)) 

おかげで...

+0

それはする必要がありません'dplyr'溶液? –

+0

ここで 'merge(a、b、by = 'supplier')%>% mutate(マテリアル=合体(material.x、material.y))%>% select(サプライヤ、id、マテリアル)' – bouncyball

+0

'setDT(df)[、Material:= ifelse(is.na(Material)、names(which.max(table(Material))])、Material )、by = Supplier] [] ' – BigDataScientist

答えて

2

あなたはdplyr関数内tableを使用してそれを行うことができます:

a %>% 
group_by(Supplier) %>% 
mutate(Material=ifelse(is.na(Material),names(sort(table(Material),dec=T))[1],Material)) 

これが返されます。

ID Material Supplier 
    <int> <chr> <int> 
1  1  a  1 
2  2  b  2 
3  3  a  1 
4  4  b  2 
5  4  a  2 
6  4  b  2 
+0

ありがとうございます。これを機能させるためにはまず材料を文字に変換しなければならなかったが、それはうまくいった。 新しいデータが印刷されるだけでなく、データフレームに格納されるように、この接頭辞に "a < - "を付ける必要があります。 – GreenManXY

+0

数値を使ってこれを使うのに問題があります...なぜか?エラーメッセージは出力されませんが、NAsを置き換えるものではありません。( – GreenManXY

+0

aとbの代わりに1と2の列で試してみましたが、結果の列は次のようになります。テーブルの名前を取っているので、文字型のテーブルを作成します。数値として保持したい場合は、単にas.numeric(名前(sort(table(Material)、dec = T))を実行します。 – Lamia

関連する問題