2016-12-16 8 views
0

グラフの目的のために今すぐ月にレベルがあるRのエラー。これはバグか論理的な欠陥ですか?

s <- c("January", "February", "March", "January", "March", "April") 
t <- c(5, 3, 2, 3, 3, 7) 
df1 <- as.data.frame(s) 
df1[ , 2] <- t 

(これは説明のサンプルです)データフレームを想像してみて、私は月によって統合したかったです。私は、コードとを記述する場合要約:

library(dplyr) 
df1$s <- factor(df1$s, levels = month.name) 
summary <- df1 %>% group_by(a) %>% summarize(Sales = sum(V2)) 

出力が正しいですが、順不同で:私は次の操作を行う場合

April  7 
February 3 
January 8 
March  5 

しかし、:

df1$s <- as.factor(df1$s) 
levels(df1$s) <- c("January", "February", "March", "April") 
Summary <- df1 %>% group_by(s) %>% summarize(Sales = sum(V2)) 

出力されます:

January 7 
February 3 
March  8 
April  5 

合計は間違っていますが、順序は正しいです。これはなぜでしょうか?

月ごとにアルファベット順に整理し、他の値を変更せずに月の列を削除するようなものです。

+0

最初のコードチャンクを実行すると、正しい順序が得られます。私はあなたが 'group_by(a)'の代わりに 'group_by(s)'を意味すると仮定しています。 –

+0

上書きするのではなく、 'df1 $ s2 < - as.factor(df1 $ s);を試してください。レベル(df1 $ s2)< - c( "1月"、 "2月"、 "3月"、 "4月") 'あなたはレベル割り当てを悪用していることがわかります。また、 't'と' summary'はよく使われる組み込み関数なので、これらのvar名と混同されるかもしれません。 – Frank

答えて

2

factorを再調整したい場合は、forcatsパッケージを使用して、factor orderを操作できます。この投稿の最後に表示されているように、ファクタ順は月の順番ではありませんでした。だから、私はfct_relevel()を使ってレベルを変えて計算しました。

library(dplyr) 
library(forcats) 

df1 %>% 
mutate(s = fct_relevel(s, month.name[1:4])) %>% 
group_by(s) %>% 
summarise(Sales = sum(V2)) -> out 

out 

#    s Sales 
# <fctr> <dbl> 
#1 January  8 
#2 February  3 
#3 March  5 
#4 April  7 

# Check level order 

#levels(out$s) 
#[1] "January" "February" "March" "April" 

#levels(df1$s) 
#[1] "April" "February" "January" "March" 
関連する問題