2017-12-16 28 views
0

データフレームdfがあり、2番目の列のグループによって最小値によって新しい列が作成されるようにしたいとします。以前の投稿では、データフレームの元の行と列を保持しながら、新しい列を作成するというコンテキストでこの問題に対処していません。別の列のグループによって最小値からmutateを含む新しい列を作成する

このサンプル入力を仮定します。私が達成したい何

a <- c(1,1,1,1,2,2,2,2) 
b <- c(NA,1,2,2,3,5,6,NA) 
df <- data.frame(a,b) 
df 

a b 
1 NA   
1 1   
1 2   
1 2   
2 3   
2 5   
2 6   
2 NA   

は、この出力されます。ここでは

a b Min_b 
1 NA 1   
1 1 1   
1 2 1   
1 2 1   
2 3 3   
2 5 3   
2 6 3   
2 NA 3  

は、対応する出力との私の試みです:

df %>% group_by(a) %>% mutate(Min_b = min(b, na.rm = TRUE)) 

a b Min_b 
1 NA 1   
1 1 1   
1 2 1   
1 2 1   
2 3 1   
2 5 1   
2 6 1   
2 NA 1  

上記与えます私は、列aのグループによる列bの最小値ではなく、列bの最小値(すなわち、I後者が欲しい)。

df %>% group_by(a) %>% top_n(-1, wt = b) 

a b 
1 1 
2 3 

右の値を求めるための上記動作しますが、以下のように、のmutate内で動作するようには思えない。

df1 %>% group_by(a) %>% mutate(Min_of_b = top_n(-1, wt = b)) 

Error in is_scalar_integerish(n) : argument "n" is missing, with no default 

は、これを行うための別の方法上の任意の提案をありがとう!

+0

detach(package:plyr) 

マイGROUP_BYは、次のコード(上記と同じデータフレームを与えられた)で、正しく働いていましたおそらく 'dput(head(df)) 'のように簡単な質問のサンプルデータを提供した場合に役立ちます。さらに、期待される出力がどのように見えるのかはわかりません。 – r2evans

+0

あなたの理想的な出力をどのように期待するのかはっきりしていませんが、あなたが言ったことに基づいて、代わりに 'df%>%group_by(id)%>%mutate(new_column = min(second_column))'を使うべきだと思います。 – AntoniosK

+0

パッケージのバージョンを確認しますか? 'df%>%group_by(a)%>%mutate(Min_b = min(b、na.rm = TRUE))'は私のために働く.... – A5C1D2H2I1M1N2O1R2T1

答えて

0

私は自分の誤りを理解しました。私はおそらく、dplyrをロードした後にplyrをロードしていたので、group_byが正しく動作しませんでした。次のように問題を解決するには、私はplyrをデタッチ:それは私たちがするために非常に容易になるだろう

df %>% group_by(a) %>% mutate(Min_b = min(b, na.rm = TRUE)) 

a b Min_b 
1 NA 1   
1 1 1   
1 2 1   
1 2 1   
2 3 3   
2 5 3   
2 6 3   
2 NA 3 
関連する問題