2016-12-16 1 views
0

Представьте себе dataframe (это иллюстративный пример)Ошибка в 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 

суммы ошибочны, но порядок верен. Почему это должно быть?

Это как он организует по месяцам в алфавитном порядке, затем прибегает к столбцу Month, не изменяя другие значения.

+0

Я получаю правильный заказ, когда запускаю первый кусок кода. Хотя я предполагаю, что вы имеете в виду 'group_by (s)' вместо 'group_by (a)'. –

+0

Вместо перезаписи попробуйте 'df1 $ s2 <- as.factor (df1 $ s); уровни (df1 $ s2) <- c («Январь», «Февраль», «Марш», «Апрель») ', и вы увидите, что вы неправильно используете присвоение уровня. Кроме того, fyi, вы можете запутаться в этих именах var, поскольку 't' и' summary' являются обычно используемыми встроенными функциями. – Frank

ответ

2

Если вы хотите, чтобы воспользоваться коэффициентом амортизации, вы можете использовать пакет forcats и манипулировать порядковым номером. Как вы видите в конце этого сообщения, ваш порядок фактов не был в месячном порядке. Итак, я использовал 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" 
Смежные вопросы