Dplyr: рд╢реВрдиреНрдп-рд▓рдВрдмрд╛рдИ рд╡рд╛рд▓реЗ рд╕рдореВрд╣реЛрдВ рдХреЛ рд╕рдВрд░рдХреНрд╖рд┐рдд рдХрд░реЗрдВ

рдХреЛ рдирд┐рд░реНрдорд┐рдд 20 рдорд╛рд░реНрдЪ 2014  ┬╖  44рдЯрд┐рдкреНрдкрдгрд┐рдпрд╛рдБ  ┬╖  рд╕реНрд░реЛрдд: tidyverse/dplyr

http://stackoverflow.com/questions/22523131

рд╕реБрдирд┐рд╢реНрдЪрд┐рдд рдирд╣реАрдВ рд╣реИ рдХрд┐ рдЗрд╕рдХрд╛ рдЗрдВрдЯрд░рдлрд╝реЗрд╕ рдХреНрдпрд╛ рд╣реЛрдирд╛ рдЪрд╛рд╣рд┐рдП - рд╢рд╛рдпрдж рдбреНрд░реЙрдк = FALSE рдХреЗ рд▓рд┐рдП рдбрд┐рдлрд╝реЙрд▓реНрдЯ рд╣реЛрдирд╛ рдЪрд╛рд╣рд┐рдПред

рд╕рдмрд╕реЗ рдЙрдкрдпреЛрдЧреА рдЯрд┐рдкреНрдкрдгреА

+1 - рдпрд╣ рдХрдИ рд╡рд┐рд╢реНрд▓реЗрд╖рдгреЛрдВ рдХреЗ рд▓рд┐рдП рдПрдХ рдбреАрд▓-рдмреНрд░реЗрдХрд░ рд╣реИ

рд╕рднреА 44 рдЯрд┐рдкреНрдкрдгрд┐рдпрд╛рдБ

рдЗрд╕ рдореБрджреНрджреЗ рдХреЛ рдЦреЛрд▓рдиреЗ рдХреЗ рд▓рд┐рдП рдзрдиреНрдпрд╡рд╛рдж рд╣реИрдбрд▓реАред

:+1: рдЖрдЬ рдЙрд╕реА рдореБрджреНрджреЗ рдореЗрдВ рднрд╛рдЧ рдЧрдпрд╛, drop = FALSE рдореЗрд░реЗ рд▓рд┐рдП рдПрдХ рдмрдбрд╝реА рдорджрдж рд╣реЛрдЧреА!

dplyr рдореЗрдВ .drop = FALSE рд╕рдорддреБрд▓реНрдп рдбрд╛рд▓рдиреЗ рдХреА рд╕рдордп рд╕реАрдорд╛ рдкрд░ рдХреЛрдИ рд╡рд┐рдЪрд╛рд░? рдХреБрдЫ rCharts рдХреЛ рд╕рд╣реА рдврдВрдЧ рд╕реЗ рдкреНрд░рд╕реНрддреБрдд рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рдореБрдЭреЗ рдЗрд╕рдХреА рдЖрд╡рд╢реНрдпрдХрддрд╛ рд╣реИред

рдЗрд╕ рдмреАрдЪ рдореБрдЭреЗ рдЖрдкрдХреЗ рдХрд╛рдо рдХреЗ рд▓рд┐рдВрдХ рдореЗрдВ рдЬрд╡рд╛рдм рдорд┐рд▓ рдЧрдпрд╛ред
http://stackoverflow.com/questions/22523131

рдореИрдВрдиреЗ рджреЛ рдЪрд░ рджреНрд╡рд╛рд░рд╛ рд╕рдореВрд╣реАрдХреГрдд рдХрд┐рдпрд╛ред

+1 рдЦрд╛рд▓реА рд╕рдореВрд╣реЛрдВ рдХреЛ рди рдЫреЛрдбрд╝рдиреЗ рдХреЗ рд╡рд┐рдХрд▓реНрдк рдХреЗ рд▓рд┐рдП

#486 рдФрд░ #413 рдХреЗ рд╕рд╛рде рдХреБрдЫ рдУрд╡рд░рд▓реИрдк рд╣реЛ рд╕рдХрддрд╛ рд╣реИред

рдЦрд╛рд▓реА рд╕рдореВрд╣реЛрдВ рдХреЛ рди рдЫреЛрдбрд╝рдирд╛ рдмрд╣реБрдд рдЙрдкрдпреЛрдЧреА рд╣реЛрдЧрд╛ред рд╕рд╛рд░рд╛рдВрд╢ рддрд╛рд▓рд┐рдХрд╛рдПрдБ рдмрдирд╛рддреЗ рд╕рдордп рдЕрдХреНрд╕рд░ рдЗрд╕рдХреА рдЖрд╡рд╢реНрдпрдХрддрд╛ рд╣реЛрддреА рд╣реИред

+1 - рдпрд╣ рдХрдИ рд╡рд┐рд╢реНрд▓реЗрд╖рдгреЛрдВ рдХреЗ рд▓рд┐рдП рдПрдХ рдбреАрд▓-рдмреНрд░реЗрдХрд░ рд╣реИ

рдореИрдВ рдЙрдкрд░реЛрдХреНрдд рд╕рднреА рд╕реЗ рд╕рд╣рдордд рд╣реВрдВ - рдмрд╣реБрдд рдЙрдкрдпреЛрдЧреА рд╣реЛрдЧрд╛ред

@romainfrancois рд╡рд░реНрддрдорд╛рди рдореЗрдВ build_index_cpp() рдбреНрд░реЙрдк рд╡рд┐рд╢реЗрд╖рддрд╛ рдХрд╛ рд╕рдореНрдорд╛рди рдирд╣реАрдВ рдХрд░рддрд╛ рд╣реИ:

t1 <- data_frame(
  x = runif(10),
  g1 = rep(1:2, each = 5),
  g2 = factor(g1, 1:3)
)
g1 <- grouped_df(t1, list(quote(g2)), drop = FALSE)
attr(g1, "group_size")
# should be c(5L, 5L, 0L)
attr(g1, "indices")
# shoud be list(0:4, 5:9, integer(0))

рдбреНрд░реЙрдк рдПрдЯреНрд░рд┐рдмреНрдпреВрдЯ рдХреЗрд╡рд▓ рддрднреА рд▓рд╛рдЧреВ рд╣реЛрддрд╛ рд╣реИ рдЬрдм рдХрд┐рд╕реА рдХрд╛рд░рдХ рджреНрд╡рд╛рд░рд╛ рд╕рдореВрд╣реАрдХреГрдд рдХрд┐рдпрд╛ рдЬрд╛рддрд╛ рд╣реИ, рдЗрд╕ рдорд╛рдорд▓реЗ рдореЗрдВ рд╣рдореЗрдВ рдкреНрд░рддрд┐ рдХрд╛рд░рдХ рд╕реНрддрд░ рдкрд░ рдПрдХ рд╕рдореВрд╣ рдХреА рдЖрд╡рд╢реНрдпрдХрддрд╛ рд╣реЛрддреА рд╣реИ, рднрд▓реЗ рд╣реА рд╡рд╣ рд╕реНрддрд░ рд╡рд╛рд╕реНрддрд╡ рдореЗрдВ рдбреЗрдЯрд╛ рдкрд░ рд▓рд╛рдЧреВ рд╣реЛ рдпрд╛ рдирд╣реАрдВред

рдпрд╣ рдирд┐рдореНрдирд▓рд┐рдЦрд┐рдд рддрд░реАрдХреЛрдВ рд╕реЗ рдПрдХрд▓ рддрд╛рд▓рд┐рдХрд╛ рдХреНрд░рд┐рдпрд╛рдУрдВ рдХреЛ рднреА рдкреНрд░рднрд╛рд╡рд┐рдд рдХрд░реЗрдЧрд╛:

  • select() : рдХреЛрдИ рдкреНрд░рднрд╛рд╡ рдирд╣реАрдВ
  • arrange() : рдХреЛрдИ рдкреНрд░рднрд╛рд╡ рдирд╣реАрдВ
  • summarise() : рд╢реВрдиреНрдп рдкрдВрдХреНрддрд┐ рд╕рдореВрд╣реЛрдВ рдкрд░ рд▓рд╛рдЧреВ рдХрд╛рд░реНрдпреЛрдВ рдХреЛ 0-рд╕реНрддрд░реАрдп рдкреВрд░реНрдгрд╛рдВрдХ рджрд┐рдП рдЬрд╛рдиреЗ рдЪрд╛рд╣рд┐рдПред n() 0 рд▓реМрдЯрдирд╛ рдЪрд╛рд╣рд┐рдП, mean(x) рд╡рд╛рдкрд╕ рдЖрдирд╛ рдЪрд╛рд╣рд┐рдП NaN
  • filter() : рд╕рдореВрд╣реЛрдВ рдХрд╛ рд╕рдореВрд╣ рд╕реНрдерд┐рд░ рд░рд╣рдирд╛ рдЪрд╛рд╣рд┐рдП, рднрд▓реЗ рд╣реА рдХреБрдЫ рд╕рдореВрд╣реЛрдВ рдореЗрдВ рдЕрдм рдХреЛрдИ рдкрдВрдХреНрддрд┐рдпрд╛рдБ рди рд╣реЛрдВ
  • mutate() : рдЦрд╛рд▓реА рд╕рдореВрд╣реЛрдВ рдХреЗ рд▓рд┐рдП рднрд╛рд╡реЛрдВ рдХрд╛ рдореВрд▓реНрдпрд╛рдВрдХрди рдХрд░рдиреЗ рдХреА рдЖрд╡рд╢реНрдпрдХрддрд╛ рдирд╣реАрдВ рд╣реИ

рдЖрдЦрд┐рд░рдХрд╛рд░, drop = FALSE рдбрд┐рдлрд╝реЙрд▓реНрдЯ рд╣реЛрдЧрд╛, рдФрд░ рдпрджрд┐ drop = FALSE рдФрд░ drop = TRUE рд╢рд╛рдЦрд╛рдУрдВ рдХреЛ рд▓рд┐рдЦрдиреЗ рдореЗрдВ рдкрд░реЗрд╢рд╛рдиреА рд╣реЛрддреА рд╣реИ, рддреЛ рдореИрдВ рдЦреБрд╢реА рд╕реЗ drop = FALSE рд▓рд┐рдП рд╕рдорд░реНрдерди рдЫреЛрдбрд╝ рджреВрдВрдЧрд╛ ( рдЪреВрдВрдХрд┐ рдЖрдк рд╣рдореЗрд╢рд╛ рдХрд╛рд░рдХ рдХреЛ рдлрд┐рд░ рд╕реЗ рд╕реНрддрд░рд┐рдд рдХрд░ рд╕рдХрддреЗ рд╣реИрдВ, рдпрд╛ рдЗрд╕рдХреЗ рдмрдЬрд╛рдп рдПрдХ рдЪрд░рд┐рддреНрд░ рд╡реЗрдХреНрдЯрд░ рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░ рд╕рдХрддреЗ рд╣реИрдВ)ред

рдХреНрдпрд╛ рдЗрд╕рдХрд╛ рдХреЛрдИ рдорддрд▓рдм рд╣реИ? рдпрджрд┐ рдпрд╣ рдмрд╣реБрдд рдЕрдзрд┐рдХ рдХрд╛рдо рд╣реИ, рддреЛ рд╣рдо 0.4 . рддрдХ рдЖрдЧреЗ рдмрдврд╝ рд╕рдХрддреЗ рд╣реИрдВ

@statwonk , @wsurles , @jennybc , @slackline , @mcfrank , @eipi10 рдпрджрд┐ рдЖрдк рдорджрдж рдХрд░рдирд╛ рдЪрд╛рд╣рддреЗ рд╣реИрдВ, рддреЛ рд╕рдмрд╕реЗ рдЕрдЪреНрдЫреА рдмрд╛рдд рдпрд╣ рд╣реЛрдЧреА рдХрд┐ рдкрд░реАрдХреНрд╖рдг рдорд╛рдорд▓реЛрдВ рдХреЗ рдПрдХ рд╕реЗрдЯ рдкрд░ рдХрд╛рдо рдХрд┐рдпрд╛ рдЬрд╛рдП рдЬреЛ рд╡рд┐рднрд┐рдиреНрди рдХреНрд░рд┐рдпрд╛рдУрдВ рдХреЗ рдкрд░рд╕реНрдкрд░ рдХреНрд░рд┐рдпрд╛ рдХрд░рдиреЗ рдХреЗ рд╕рднреА рддрд░реАрдХреЛрдВ рдХрд╛ рдЕрднреНрдпрд╛рд╕ рдХрд░рддрд╛ рд╣реЛред рд╢реВрдиреНрдп-рд▓рдВрдмрд╛рдИ рд╕рдореВрд╣реЛрдВ рдХреЗ рд╕рд╛рдеред

рдЖрд╣ред рдореБрдЭреЗ рд▓рдЧрддрд╛ рд╣реИ рдХрд┐ рдореБрдЭреЗ рдирд╣реАрдВ рдкрддрд╛ рдерд╛ рдХрд┐ drop рдХреНрдпрд╛ рдХрд░рдирд╛ рдЪрд╛рд╣рд┐рдП рдерд╛ред рдЗрд╕рд╕реЗ рдпрд╣ рд╕реНрдкрд╖реНрдЯ рд╣реЛрддрд╛ рд╣реИред рдореБрдЭреЗ рдирд╣реАрдВ рд▓рдЧрддрд╛ рдХрд┐ рдпрд╣ рдмрд╣реБрдд рдХрд╛рдо рд╣реИред

рдореИрдВрдиреЗ рдкреБрд▓ рдЕрдиреБрд░реЛрдз # 833 рдЦреЛрд▓рд╛ рд╣реИ рдЬреЛ рдкрд░реАрдХреНрд╖рдг рдХрд░рддрд╛ рд╣реИ рдХрд┐ рдЙрдкрд░реЛрдХреНрдд рдПрдХрд▓ рддрд╛рд▓рд┐рдХрд╛ рдХреНрд░рд┐рдпрд╛рдПрдВ рд╢реВрдиреНрдп-рд▓рдВрдмрд╛рдИ рд╡рд╛рд▓реЗ рд╕рдореВрд╣реЛрдВ рдХреЛ рд╕рд╣реА рдврдВрдЧ рд╕реЗ рд╕рдВрднрд╛рд▓рддреА рд╣реИрдВ рдпрд╛ рдирд╣реАрдВред рдЕрдзрд┐рдХрд╛рдВрд╢ рдкрд░реАрдХреНрд╖рдгреЛрдВ рдкрд░ рдЯрд┐рдкреНрдкрдгреА рдХреА рдЬрд╛рддреА рд╣реИ, рдХреНрдпреЛрдВрдХрд┐ dplyr рд╡рд░реНрддрдорд╛рди рдореЗрдВ рдЙрдиреНрд╣реЗрдВ рд╡рд┐рдлрд▓ рдХрд░ рджреЗрддрд╛ рд╣реИ, рдирд┐рд╢реНрдЪрд┐рдд рд░реВрдк рд╕реЗред

+1, рдпрд╣рд╛рдВ рдХреЛрдИ рд╕реНрдерд┐рддрд┐ рдЕрдкрдбреЗрдЯ рд╣реИ? рдкреНрдпрд╛рд░ рдХрд╛ рд╕рд╛рд░рд╛рдВрд╢, рдЦрд╛рд▓реА рд╕реНрддрд░ рд░рдЦрдиреЗ рдХреА рдЬрд░реВрд░рдд рд╣реИ!

@ebergelson , рд╢реВрдиреНрдп-рд▓рдВрдмрд╛рдИ рд╡рд╛рд▓реЗ рд╕рдореВрд╣ рдкреНрд░рд╛рдкреНрдд рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рдореЗрд░рд╛ рд╡рд░реНрддрдорд╛рди рд╣реИрдХ рдпрд╣рд╛рдВ рд╣реИред рдореБрдЭреЗ рдЕрдХреНрд╕рд░ рдЗрд╕рдХреА рдЖрд╡рд╢реНрдпрдХрддрд╛ рд╣реЛрддреА рд╣реИ рдЗрд╕рд▓рд┐рдП рдореЗрд░реЗ рдмрд╛рд░ рдЪрд╛рд░реНрдЯ рдвреЗрд░ рд╣реЛ рдЬрд╛рдПрдВрдЧреЗред

рдпрд╣рд╛рдВ df рдореЗрдВ 3 рдХреЙрд▓рдо рд╣реИрдВ: рдирд╛рдо, рд╕рдореВрд╣ рдФрд░ рдореАрдЯреНрд░рд┐рдХ

df2 <- expand.grid(name = unique(df$name), group = unique(df$group)) %>%
    left_join(df, by=c("name","group")) %>%
    mutate(metric = ifelse(is.na(metric),0,metric))

рдореИрдВ рдХреБрдЫ рдРрд╕рд╛ рд╣реА рдХрд░рддрд╛ рд╣реВрдВ - рд▓рд╛рдкрддрд╛ рд╕рдореВрд╣реЛрдВ рдХреА рдЬрд╛рдВрдЪ рдХрд░реЗрдВ, рдлрд┐рд░ рдпрджрд┐ рдХреЛрдИ рд╕рднреА рд╕рдВрдпреЛрдЬрди рдЙрддреНрдкрдиреНрди рдХрд░рддрд╛ рд╣реИ рдФрд░ left_join ред

рджреБрд░реНрднрд╛рдЧреНрдп рд╕реЗ, рдРрд╕рд╛ рдирд╣реАрдВ рд▓рдЧрддрд╛ рдХрд┐ рдЗрд╕ рдореБрджреНрджреЗ рдХреЛ рдмрд╣реБрдд рдЕрдзрд┐рдХ рдкреНрдпрд╛рд░ рдорд┐рд▓ рд░рд╣рд╛ рд╣реИ... рд╢рд╛рдпрдж рдЗрд╕рд▓рд┐рдП рдХрд┐ рдЗрд╕рдХрд╛ рд╕реАрдзрд╛-рд╕реАрдзрд╛ рд╕рдорд╛рдзрд╛рди рд╣реИред

@wsurles , @bpbond рдзрдиреНрдпрд╡рд╛рдж, рд╣рд╛рдБ рдореИрдВрдиреЗ рдЖрдкрдХреЗ рд╕реБрдЭрд╛рд╡ рдХреЗ рд╕рдорд╛рди рд╣реА рд╡рд░реНрдХрдЕрд░рд╛рдЙрдВрдб рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд┐рдпрд╛ рд╣реИ! .рдбреНрд░реЙрдк рдЬреИрд╕реЗ рдмрд┐рд▓реНрдЯ-рдЗрди рдлрд┐рдХреНрд╕ рджреЗрдЦрдирд╛ рдкрд╕рдВрдж рдХрд░реЗрдВрдЧреЗред

рдмрд╕ рдЙрдкрд░реЛрдХреНрдд рд╕рднреА рдХреЛ рдЬреЛрдбрд╝рдиреЗ рдФрд░ рд╕рд╣рдордд рд╣реЛрдиреЗ рдХреЗ рд▓рд┐рдП - рдпрд╣ рдХрдИ рд╡рд┐рд╢реНрд▓реЗрд╖рдгреЛрдВ рдХрд╛ рдПрдХ рдЕрддрд┐ рдорд╣рддреНрд╡рдкреВрд░реНрдг рдкрд╣рд▓реВ рд╣реИред рдПрдХ рдХрд╛рд░реНрдпрд╛рдиреНрд╡рдпрди рджреЗрдЦрдирд╛ рдкрд╕рдВрдж рдХрд░реЗрдВрдЧреЗред

рдпрд╣рд╛рдВ рдХреБрдЫ рдФрд░ рд╡рд┐рд╡рд░рдгреЛрдВ рдХреА рдЖрд╡рд╢реНрдпрдХрддрд╛ рд╣реИ:

рдЕрдЧрд░ рдореЗрд░реЗ рдкрд╛рд╕ рдпрд╣ рд╣реИ:

> df <- data_frame( x = c(1,1,1,2,2), f = factor( c(1,2,3,1,1) ) )
> df
Source: local data frame [5 x 2]

  x f
1 1 1
2 1 2
3 1 3
4 2 1
5 2 1

рдФрд░ рдореИрдВ x рдлрд┐рд░ f рджреНрд╡рд╛рд░рд╛ рд╕рдореВрд╣рд┐рдд рдХрд░рддрд╛ рд╣реВрдВ, рдореИрдВ 6 (2x3) рд╕рдореВрд╣реЛрдВ рдХреЗ рд╕рд╛рде рд╕рдорд╛рдкреНрдд рд╣реЛрддрд╛ рд╣реВрдВ рдЬрд╣рд╛рдВ рд╕рдореВрд╣ (2, 2) рдФрд░ (2,3) рдЦрд╛рд▓реА рд╣реИрдВред рдареАрдХ рд╣реИред рдореБрдЭреЗ рд▓рдЧрддрд╛ рд╣реИ рдХрд┐ рдореИрдВ рдЗрд╕реЗ рд▓рд╛рдЧреВ рдХрд░рдиреЗ рдХрд╛ рдкреНрд░рдмрдВрдзрди рдХрд░ рд╕рдХрддрд╛ рд╣реВрдВред

рдЕрдм, рдЕрдЧрд░ рдореЗрд░реЗ рдкрд╛рд╕ рдпрд╣ рд╣реИ рддреЛ рдХреНрдпрд╛ рд╣реЛрдЧрд╛:

> df <- data_frame( f = factor( c(1,1,2,2), levels = 1:3), x = c(1,2,1,4) )
> df
Source: local data frame [4 x 2]

  f x
1 1 1
2 1 2
3 2 1
4 2 4

рдФрд░ рдореИрдВ f рдлрд┐рд░ x рдЖрдзрд╛рд░ рдкрд░ рд╕рдореВрд╣ рдмрдирд╛рдирд╛ рдЪрд╛рд╣рддрд╛ рд╣реВрдВред рд╕рдореВрд╣ рдХреНрдпрд╛ рд╣реЛрдВрдЧреЗ? @ рд╣реИрдбрд▓реА

рджреЛрдиреЛрдВ stats::aggregate рдФрд░ plyr::ddply рдЗрд╕ рдорд╛рдорд▓реЗ рдореЗрдВ 4 рд╕рдореВрд╣реЛрдВ рдХреЛ рд▓реМрдЯрд╛рддреЗ рд╣реИрдВ (1,1; 1,2; 2,1; рдФрд░ 2,4), рдЗрд╕рд▓рд┐рдП рдореИрдВ рд╕реБрдЭрд╛рд╡ рджреВрдВрдЧрд╛ рдХрд┐ рдпрд╣ рд╡реНрдпрд╡рд╣рд╛рд░ рдХреЗ рдЕрдиреБрд░реВрдк рд╣реИ .

рдХреНрдпрд╛ рдпрд╣ рдЗрд╕рдХреЗ рдмрдЬрд╛рдп table() рд╕рд╣рдордд рдирд╣реАрдВ рд╣реЛрдирд╛ рдЪрд╛рд╣рд┐рдП, рдпрд╛рдиреА, 9 рд╕рдореВрд╣ рд▓реМрдЯрд╛рдПрдВ?

> table(df$f, df$x)
  1 2 4
1 1 1 0
2 1 0 1
3 0 0 0

рдореБрдЭреЗ рдЙрдореНрдореАрдж рд╣реИ рдХрд┐ df %>% group_by(f, x) %>% tally рдореВрд▓ рд░реВрдк рд╕реЗ with(df, as.data.frame(table(f, x))) рдФрд░ ddply(df, .(f, x), nrow, .drop=FALSE) рдЬреИрд╕рд╛ рд╣реА рдкрд░рд┐рдгрд╛рдо рджреЗрдЧрд╛ред

рдореИрдВрдиреЗ рд╕реЛрдЪрд╛ рдерд╛ рдХрд┐ рд╣рдорд╛рд░рд╛ рд╡рд╛рдВрдЫрд┐рдд рд╡реНрдпрд╡рд╣рд╛рд░ рд╢реВрдиреНрдп-рд▓рдВрдмрд╛рдИ рд╡рд╛рд▓реЗ рд╕рдореВрд╣реЛрдВ рдХреЛ рд╕рдВрд░рдХреНрд╖рд┐рдд рдХрд░рдирд╛ рдерд╛ рдпрджрд┐ рд╡реЗ рдХрд╛рд░рдХ рд╣реИрдВ (рдЬреИрд╕реЗ .drop рдореЗрдВ plyr), рддреЛ рдореБрдЭреЗ рд▓рдЧрддрд╛ рд╣реИ рдХрд┐ рд╣рдо @huftis рдХрд╛ рд╕реБрдЭрд╛рд╡ рдЪрд╛рд╣рддреЗ рд╣реИрдВред рдореИрдВ рд╕реБрдЭрд╛рд╡ рджреВрдВрдЧрд╛ рдХрд┐ рдбрд┐рдлрд╝реЙрд▓реНрдЯ рд╣реЛрдирд╛ рдбреНрд░реЙрдк = рд╕рдЪ рд╣реИ, рддрд╛рдХрд┐ рдбрд┐рдлрд╝реЙрд▓реНрдЯ рд╡реНрдпрд╡рд╣рд╛рд░ рдореЗрдВ рдмрджрд▓рд╛рд╡ рди рд╣реЛ, рдлрд┐рд░ рд╕реЗ

рд╣рдореНрдо, рдореЗрд░реЗ рд╕рд┐рд░ рдХреЛ рдареАрдХ рдЙрд╕реА рддрд░рд╣ рд▓рдкреЗрдЯрдирд╛ рдореБрд╢реНрдХрд┐рд▓ рд╣реИ рдЬреИрд╕рд╛ рд╡реНрдпрд╡рд╣рд╛рд░ рд╣реЛрдирд╛ рдЪрд╛рд╣рд┐рдПред рдХреНрдпрд╛ рдпреЗ рдмрд╣реБрдд рд╣реА рд╕рд░рд▓ рд╡рд┐рдЪрд╛рд░ рдкреНрд░рдпреЛрдЧ рд╕рд╣реА рд▓рдЧрддреЗ рд╣реИрдВ?

df <- data_frame(x = 1, y = factor(1, levels = 2))
df %>% group_by(x) %>% summarise(n())
#> x n
#> 1 1  

df %>% group_by(y) %>% summarise(n())
#> y n
#> 1 1
#> 2 0

df %>% group_by(x, y) %>% summarise(n()
#> x y n
#> 1 1 1
#> 1 2 0

рд▓реЗрдХрд┐рди рдХреНрдпрд╛ рд╣реЛрдЧрд╛ рдпрджрд┐ x рдореЗрдВ рдПрдХрд╛рдзрд┐рдХ рдорд╛рди рд╣реЛрдВ? рдХреНрдпрд╛ рдЗрд╕реЗ рдЗрд╕ рддрд░рд╣ рдХрд╛рдо рдХрд░рдирд╛ рдЪрд╛рд╣рд┐рдП?

df <- data_frame(x = 1:2, y = factor(1, levels = 2))
df %>% group_by(x, y) %>% summarise(n()
#> x y n
#> 1 1 1
#> 2 1 1
#> 1 1 0
#> 2 2 0

рд╣реЛ рд╕рдХрддрд╛ рд╣реИ рдХрд┐ рдЦрд╛рд▓реА рд╕рдореВрд╣реЛрдВ рдХреЛ рд╕рдВрд░рдХреНрд╖рд┐рдд рдХрд░рдирд╛ рдХреЗрд╡рд▓ рдПрдХ рдЪрд░ рджреНрд╡рд╛рд░рд╛ рд╕рдореВрд╣рд┐рдд рдХрд░рддреЗ рд╕рдордп рд╣реА рд╕рдордЭ рдореЗрдВ рдЖрддрд╛ рд╣реИ? рдпрджрд┐ рд╣рдо рдЗрд╕реЗ рдЕрдзрд┐рдХ рд╡рд╛рд╕реНрддрд╡рд┐рдХ рд░реВрдк рд╕реЗ рдлреНрд░реЗрдо рдХрд░рддреЗ рд╣реИрдВ, рдЙрджрд╛рд╣рд░рдг рдХреЗ рд▓рд┐рдП data_frame(age_group = c(40, 60), sex = factor(M, levels = c("F", "M")) рдХреНрдпрд╛ рдЖрдк рд╡рд╛рд╕реНрддрд╡ рдореЗрдВ рдорд╣рд┐рд▓рд╛рдУрдВ рдХреЗ рд▓рд┐рдП рдЧрд┐рдирддреА рдЪрд╛рд╣рддреЗ рд╣реИрдВ? рдореБрдЭреЗ рд▓рдЧрддрд╛ рд╣реИ рдХрд┐ рдХрднреА-рдХрднреА рдЖрдк рдХрд░реЗрдВрдЧреЗ рдФрд░ рдХрднреА-рдХрднреА рдЖрдк рдирд╣реАрдВ рдХрд░реЗрдВрдЧреЗред рд╕рднреА рд╕рдВрдпреЛрдЬрдиреЛрдВ рдХрд╛ рд╡рд┐рд╕реНрддрд╛рд░ рдХрд░рдирд╛ рдореЗрд░реЗ рд▓рд┐рдП рдХреБрдЫ рдЕрд▓рдЧ рдСрдкрд░реЗрд╢рди рдЬреИрд╕рд╛ рд▓рдЧрддрд╛ рд╣реИ (рдФрд░ рдХрд╛рд░рдХреЛрдВ рдХреЗ рдЙрдкрдпреЛрдЧ рд╕реЗ рд╕реНрд╡рддрдВрддреНрд░)ред

рд╢рд╛рдпрдж group_by рдХреЛ drop рдФрд░ expand рддрд░реНрдХреЛрдВ рдХреА рдЖрд╡рд╢реНрдпрдХрддрд╛ рд╣реИ? drop = FALSE рдбреЗрдЯрд╛ рдореЗрдВ рдкреНрд░рдХрдЯ рдирд╣реАрдВ рд╣реЛрдиреЗ рд╡рд╛рд▓реЗ рдХрд╛рд░рдХ рд╕реНрддрд░реЛрдВ рджреНрд╡рд╛рд░рд╛ рдЙрддреНрдкрдиреНрди рд╕рднреА рдЖрдХрд╛рд░ рд╢реВрдиреНрдп рд╕рдореВрд╣реЛрдВ рдХреЛ рд░рдЦреЗрдЧрд╛ред expand = TRUE рдбреЗрдЯрд╛ рдореЗрдВ рджрд┐рдЦрд╛рдИ рдирд╣реАрдВ рджреЗрдиреЗ рд╡рд╛рд▓реЗ рдорд╛рдиреЛрдВ рдХреЗ рд╕рдВрдпреЛрдЬрди рд╕реЗ рдЙрддреНрдкрдиреНрди рд╕рднреА рдЖрдХрд╛рд░ рдХреЗ рд╢реВрдиреНрдп рд╕рдореВрд╣реЛрдВ рдХреЛ рд░рдЦреЗрдЧрд╛ред

@ рд╣реИрдбрд▓реА рдЖрдкрдХреЗ рдЙрджрд╛рд╣рд░рдг рдореБрдЭреЗ рд╕рд╣реА рд▓рдЧрддреЗ рд╣реИрдВ (рдорд╛рди levels = 1:2 , рди рдХрд┐ levels = 2 )ред рдФрд░ рдореБрдЭреЗ рд▓рдЧрддрд╛ рд╣реИ рдХрд┐ рдХрдИ рдЪрд░ рджреНрд╡рд╛рд░рд╛ рд╕рдореВрд╣рдмрджреНрдз рдХрд░рддреЗ рд╕рдордп рднреА рдЦрд╛рд▓реА рд╕рдореВрд╣реЛрдВ рдХреЛ рд╕рдВрд░рдХреНрд╖рд┐рдд рдХрд░рдирд╛ рд╕рдордЭ рдореЗрдВ рдЖрддрд╛ рд╣реИред рдЙрджрд╛рд╣рд░рдг рдХреЗ рд▓рд┐рдП, рдпрджрд┐ рдЪрд░ sex ( male рдФрд░ female ) рдФрд░ answer (рдкреНрд░рд╢реНрдирд╛рд╡рд▓реА рдкрд░, рд╕реНрддрд░реЛрдВ рдХреЗ рд╕рд╛рде disagree , neutral , agree ), рдФрд░ рдЖрдк рдкреНрд░рддреНрдпреЗрдХ рд▓рд┐рдВрдЧ рдХреЗ рд▓рд┐рдП рдкреНрд░рддреНрдпреЗрдХ рдЙрддреНрддрд░ рдХреА рдЖрд╡реГрддреНрддрд┐ рдХреА рдЧрдгрдирд╛ рдХрд░рдирд╛ рдЪрд╛рд╣рддреЗ рд╣реИрдВ (рдЙрджрд╛рд╣рд░рдг рдХреЗ рд▓рд┐рдП рдПрдХ рддрд╛рд▓рд┐рдХрд╛ рдХреЗ рд▓рд┐рдП, рдпрд╛ рдмрд╛рдж рдореЗрдВ рдкреНрд▓реЙрдЯрд┐рдВрдЧ рдХреЗ рд▓рд┐рдП), рдЖрдк рдХреЗрд╡рд▓ рдПрдХ рдЙрддреНрддрд░ рд╢реНрд░реЗрдгреА рдХреЛ рдЫреЛрдбрд╝рдирд╛ рдирд╣реАрдВ рдЪрд╛рд╣реЗрдВрдЧреЗ рдХреНрдпреЛрдВрдХрд┐ рдХрд┐рд╕реА рдорд╣рд┐рд▓рд╛ рдиреЗ рдЗрд╕рдХрд╛ рдЙрддреНрддрд░ рдирд╣реАрдВ рджрд┐рдпрд╛ред

рдореИрдВ рдкрд░рд┐рдгрд╛рдореА data_frame (рд╕реНрдЯреНрд░рд┐рдВрдЧреНрд╕ рдореЗрдВ рдкрд░рд┐рд╡рд░реНрддрд┐рдд рдирд╣реАрдВ) рдФрд░ _рдореВрд▓ рд╕реНрддрд░реЛрдВ_ рдХреЗ рд╕рд╛рде рдХрд╛рд░рдХ рдЪрд░ рдХреЗ рдХрд╛рд░рдХ рдЪрд░ рдмрдиреЗ рд░рд╣рдиреЗ рдХреА рднреА рдЕрдкреЗрдХреНрд╖рд╛ рдХрд░рддрд╛ рд╣реВрдВред (рдЗрд╕рд▓рд┐рдП рдбреЗрдЯрд╛ рдкреНрд▓реЙрдЯ рдХрд░рддреЗ рд╕рдордп, рдЙрддреНрддрд░ рд╢реНрд░реЗрдгрд┐рдпрд╛рдВ рд╕рд╣реА рдХреНрд░рдо рдореЗрдВ рд╣реЛрдВрдЧреА, рди рдХрд┐ рд╡рд░реНрдгрдорд╛рд▓рд╛ agree , disagree , neutral )ред

рдЖрдкрдХреЗ рдЕрдВрддрд┐рдо рдЙрджрд╛рд╣рд░рдг рдХреЗ рд▓рд┐рдП, _рдХреБрдЫ рдорд╛рдорд▓реЛрдВ рдореЗрдВ_ sex рдЪрд░ рдХреЛ рдЧрд┐рд░рд╛рдирд╛ рд╕реНрд╡рд╛рднрд╛рд╡рд┐рдХ рд╣реЛрдЧрд╛ (рдЙрджрд╛рд╣рд░рдг рдХреЗ рд▓рд┐рдП, рдпрджрд┐ _рдЬрд╛рдирдмреВрдЭрдХрд░_ рдХрд┐рд╕реА рдорд╣рд┐рд▓рд╛ рдХрд╛ рд╕рд░реНрд╡реЗрдХреНрд╖рдг рдирд╣реАрдВ рдХрд┐рдпрд╛ рдЧрдпрд╛ рдерд╛), рдФрд░ _рдЕрдиреНрдп рдорд╛рдорд▓реЛрдВ рдореЗрдВ_ рдирд╣реАрдВ (рдЙрджрд╛рд╣рд░рдг рдХреЗ рд▓рд┐рдП, рд╕реНрддрд░реАрдХреГрдд рдЬрдиреНрдо рджреЛрд╖реЛрдВ рдХреА рд╕рдВрдЦреНрдпрд╛ рдХреА рдЧрдгрдирд╛ рдХрд░рддреЗ рд╕рдордп) рд▓рд┐рдВрдЧ (рдФрд░ рд╢рд╛рдпрдж рд╡рд░реНрд╖))ред рд▓реЗрдХрд┐рди рдпрд╣ (рдФрд░ рдЪрд╛рд╣рд┐рдП) рдЖрд╕рд╛рдиреА рд╕реЗ _after_ рдбреЗрдЯрд╛ рдПрдХрддреНрд░ рдХрд░рдиреЗ рдХреЗ рд╕рд╛рде рдирд┐рдкрдЯрд╛рдпрд╛ рдЬрд╛ рд╕рдХрддрд╛ рд╣реИред (рдПрдХ рдЕрд▓рдЧ рд╕рдорд╛рдзрд╛рди _vector-valued_ .drop рддрд░реНрдХ рдХреЛ рд╕реНрд╡реАрдХрд╛рд░ рдХрд░рдирд╛ рд╣реЛрдЧрд╛ред рдпрд╣ рдЕрдЪреНрдЫрд╛ рд╣реЛрдЧрд╛, рд▓реЗрдХрд┐рди рдореБрдЭреЗ рд▓рдЧрддрд╛ рд╣реИ рдХрд┐ рдпрд╣ рдЪреАрдЬреЛрдВ рдХреЛ рдЬрдЯрд┐рд▓ рдХрд░ рд╕рдХрддрд╛ рд╣реИ?)

(рдПрдХ рдЕрд▓рдЧ рд╕рдорд╛рдзрд╛рди рд╡реЗрдХреНрдЯрд░-рдореВрд▓реНрдпрд╡рд╛рди .drop рддрд░реНрдХ рдХреЛ рд╕реНрд╡реАрдХрд╛рд░ рдХрд░рдирд╛ рд╣реЛрдЧрд╛ред рдпрд╣ рдЕрдЪреНрдЫрд╛ рд╣реЛрдЧрд╛, рд▓реЗрдХрд┐рди рдореБрдЭреЗ рд▓рдЧрддрд╛ рд╣реИ рдХрд┐ рдпрд╣ рдЪреАрдЬреЛрдВ рдХреЛ рдЬрдЯрд┐рд▓ рдХрд░ рд╕рдХрддрд╛ рд╣реИ?)

рд╣рд╛рдБ, рд╢рд╛рдпрдж рдмрд╣реБрдд рдЬрдЯрд┐рд▓ред рдЕрдиреНрдпрдерд╛ рдореИрдВ @huftis рдХреА рдЯрд┐рдкреНрдкрдгрд┐рдпреЛрдВ рд╕реЗ рд╕рд╣рдордд рд╣реВрдВред

@ рд╣реИрдбрд▓реА
рдореБрдЭреЗ рд▓рдЧрддрд╛ рд╣реИ
рд╣рд╛рдБ рдорд╛рдиреЛрдВ рдХреЗ рд╕рднреА рд╕рдВрдпреЛрдЬрдиреЛрдВ рдкрд░ рд╕рдореВрд╣_рдмреА рдореЗрдВ рд╡рд┐рд╕реНрддрд╛рд░ рдХрд░реЗрдВ рдпрджрд┐ рд╡реЗ рдбреЗрдЯрд╛ рдореЗрдВ рдореМрдЬреВрдж рд╣реИрдВред
NO рдЙрди рдХрд╛рд░рдХ рд╕реНрддрд░реЛрдВ рдкрд░ рд╡рд┐рд╕реНрддрд╛рд░ рди рдХрд░реЗрдВ рдЬреЛ рдореМрдЬреВрдж рдирд╣реАрдВ рд╣реИрдВред

рдореЗрд░рд╛ рдЕрдХреНрд╕рд░ рдЙрдкрдпреЛрдЧ рдХрд┐рдпрд╛ рдЬрд╛рдиреЗ рд╡рд╛рд▓рд╛ рдорд╛рдорд▓рд╛ рдЪрд╛рд░реНрдЯ рдХреЗ рд▓рд┐рдП рд╕рд╛рд░рд╛рдВрд╢рд┐рдд рдбреЗрдЯрд╛ рдХрд╛ рдПрдХ рд╕реЗрдЯ рддреИрдпрд╛рд░ рдХрд░ рд░рд╣рд╛ рд╣реИ (рдЕрдиреНрд╡реЗрд╖рдг рдХреЗ рджреМрд░рд╛рди)ред рдФрд░ рдЪрд╛рд░реНрдЯ рдореЗрдВ рдорд╛рдиреЛрдВ рдХреЗ рд╕рднреА рд╕рдВрдпреЛрдЬрди рд╣реЛрдиреЗ рдЪрд╛рд╣рд┐рдПред рд▓реЗрдХрд┐рди рдЙрдиреНрд╣реЗрдВ рд╕рднреА рд╕рдореВрд╣реЛрдВ рдХреЗ рд▓рд┐рдП 0 рд╡рд╛рд▓реЗ рдХрд╛рд░рдХ рд╕реНрддрд░ рдХреА рдЖрд╡рд╢реНрдпрдХрддрд╛ рдирд╣реАрдВ рд╣реИ .. рдЙрджрд╛рд╣рд░рдг рдХреЗ рд▓рд┐рдП рдЖрдк рд╕рднреА рд╕рдВрдпреЛрдЬрдиреЛрдВ рдХреЗ рдмрд┐рдирд╛ рдмрд╛рд░ рдЪрд╛рд░реНрдЯ рдХреЛ рд╕реНрдЯреИрдХ рдирд╣реАрдВ рдХрд░ рд╕рдХрддреЗред рд▓реЗрдХрд┐рди рдЖрдкрдХреЛ рдРрд╕реЗ рдХрд╛рд░рдХ рдорд╛рдиреЛрдВ рдХреА рдЖрд╡рд╢реНрдпрдХрддрд╛ рдирд╣реАрдВ рд╣реИ рдЬреЛ рдбреЗрдЯрд╛ рдореЗрдВ рдореМрдЬреВрдж рдирд╣реАрдВ рд╣реИрдВ, рдпреЗ рдХреЗрд╡рд▓ 0 рд╣реЛрдВрдЧреЗ рдЬрдм рд╕реНрдЯреИрдХ рдХрд┐рдпрд╛ рдЬрд╛рдПрдЧрд╛ рдФрд░ рдХрд┐рдВрд╡рджрдВрддреА рдореЗрдВ рдПрдХ рдЦрд╛рд▓реА рдорд╛рди рд╣реЛрдЧрд╛ред

рдореЗрд░рд╛ рдорд╛рдирдирд╛ тАЛтАЛтАЛтАЛрд╣реИ рдХрд┐ рд╕рдореВрд╣_рдмреА рдореЗрдВ рд╕рднреА рдорд╛рдиреЛрдВ рдкрд░ рд╡рд┐рд╕реНрддрд╛рд░ рдХрд░рдирд╛ рдбрд┐рдлрд╝реЙрд▓реНрдЯ рд╣реЛрдирд╛ рдЪрд╛рд╣рд┐рдП рдХреНрдпреЛрдВрдХрд┐ рдпрджрд┐ рдЖрд╡рд╢реНрдпрдХ рд╣реЛ рддреЛ рд╕рдореВрд╣ рдХреЗ рдмрд╛рдж 0 рдорд╛рдорд▓реЛрдВ рдХреЛ рдлрд╝рд┐рд▓реНрдЯрд░ рдХрд░рдирд╛ рдмрд╣реБрдд рдЖрд╕рд╛рди (рдФрд░ рдЕрдзрд┐рдХ рд╕рд╣рдЬ) рд╣реЛрдирд╛ рдЪрд╛рд╣рд┐рдПред рдореБрдЭреЗ рдирд╣реАрдВ рд▓рдЧрддрд╛ рдХрд┐ .рдбреНрд░реЙрдк рддрд░реНрдХ рдЖрд╡рд╢реНрдпрдХ рд╣реИ, рдХреНрдпреЛрдВрдХрд┐ 0 рдорд╛рдорд▓реЛрдВ рдХреЛ рдлрд╝рд┐рд▓реНрдЯрд░ рдХрд░рдирд╛ рдХрд╛рдлреА рдЖрд╕рд╛рди рд╣реИред рд╣рдо рдХрд┐рд╕реА рднреА рдЕрдиреНрдп рдлрд╝рдВрдХреНрд╢рди рдХреЗ рд▓рд┐рдП рдЕрддрд┐рд░рд┐рдХреНрдд рддрд░реНрдХреЛрдВ рдХрд╛ рдЙрдкрдпреЛрдЧ рдирд╣реАрдВ рдХрд░рддреЗ рд╣реИрдВ, рдЗрд╕рд▓рд┐рдП рдпрд╣ рдореЛрд▓реНрдб рдХреЛ рддреЛрдбрд╝ рджреЗрдЧрд╛ред рдбрд┐рдлрд╝реЙрд▓реНрдЯ рдХреЗрд╡рд▓ group_by рдХреЗ рдЖрдзрд╛рд░ рдкрд░ рдореМрдЬреВрджрд╛ рдорд╛рдиреЛрдВ рдХреЗ рд╕рднреА рд╕рдВрдпреЛрдЬрдиреЛрдВ рдХреЗ рд▓рд┐рдП рдкрд░рд┐рдгрд╛рдо рджрд┐рдЦрд╛рдиреЗ рдХреЗ рд▓рд┐рдП рд╣реЛрдирд╛ рдЪрд╛рд╣рд┐рдПред

рдореБрдЭреЗ рд▓рдЧрддрд╛ рд╣реИ рдХрд┐ рдпрд╣ рд╕рд╣реА рдбрд┐рдлрд╝реЙрд▓реНрдЯ рд╡реНрдпрд╡рд╣рд╛рд░ рд╣реЛрдЧрд╛ред рдпрд╣рд╛рдВ рдЕрджреНрд╡рд┐рддреАрдп рдХреЗрд╡рд▓ рдХрд╛рд░рдХ рдореЗрдВ рдореМрдЬреВрджрд╛ рдореВрд▓реНрдпреЛрдВ рдкрд░ рд╡рд┐рд╕реНрддрд╛рд░ рдХрд░реЗрдЧрд╛, рд╕рднреА рдХрд╛рд░рдХ рд╕реНрддрд░реЛрдВ рдкрд░ рдирд╣реАрдВред (рдпрд╣ рд╡рд╣реА рд╣реИ рдЬреЛ рдореИрдВ рд╕рдореВрд╣_рдмреА рдЪрд▓рд╛рдиреЗ рдХреЗ рдмрд╛рдж рдЪрд▓рд╛рддрд╛ рд╣реВрдВ рдЬреЛ 0 рдорд╛рди рдЫреЛрдбрд╝ рджреЗрддрд╛ рд╣реИ)

## Expand data so plot groups works correctly
  df2 <- expand.grid(name = unique(df$name), group = unique(df$group)) %>%
    left_join(df, by=c("name","group")) %>%
    mutate(
      measure = ifelse(is.na(measure),0,measure)
    )

рдПрдХрдорд╛рддреНрд░ рдорд╛рдорд▓рд╛ рдореИрдВ рджреЗрдЦ рд╕рдХрддрд╛ рд╣реВрдВ рдХрд┐ рдЖрдк рдПрдХ рдореВрд▓реНрдп рдХрд╣рд╛рдВ рдЪрд╛рд╣рддреЗ рд╣реИрдВ, рднрд▓реЗ рд╣реА рд╕рднреА рд╕рдореВрд╣реЛрдВ рдореЗрдВ рд╢реВрдиреНрдп рд╕рдордп рдбреЗрдЯрд╛ рдХреЗ рд╕рд╛рде рд╣реЛред рд╣реЛ рд╕рдХрддрд╛ рд╣реИ рдХрд┐ рдмреАрдЪ рдореЗрдВ рдХрд╣реАрдВ рдбреЗрдЯрд╛ рдХрд╛ рдПрдХ рджрд┐рди рдЧрд╛рдпрдм рд╣реЛред рдпрд╣рд╛рдВ рдПрдХ рддрд┐рдерд┐ рд╕реАрдорд╛ рдкрд░ рд╡рд┐рд╕реНрддрд╛рд░ рдФрд░ рд╢рд╛рдорд┐рд▓ рд╣реЛрдирд╛ рдЕрднреА рднреА рдЖрд╡рд╢реНрдпрдХ рд╣реЛрдЧрд╛ред рдХрд╛рд░рдХ рд╕реНрддрд░ рдХрд╛ рдорд╛рдорд▓рд╛ рд▓рд╛рдЧреВ рдирд╣реАрдВ рд╣реЛрдЧрд╛ред рдореБрдЭреЗ рд▓рдЧрддрд╛ рд╣реИ рдХрд┐ рдбреЗрдЯрд╛ рдХреНрд░рдВрдЪрд░ рдХреЗ рд▓рд┐рдП рд▓рд╛рдкрддрд╛ рддрд┐рдерд┐рдпреЛрдВ рдХреЛ рд╕реНрд╡рдпрдВ рд╣реА рд╕рдВрднрд╛рд▓рдирд╛ рдЙрдЪрд┐рдд рд╣реИред

рдЗрд╕ рдкреБрд╕реНрддрдХрд╛рд▓рдп рдкрд░ рдЖрдкрдХреЗ рд╕рднреА рдорд╣рд╛рди рдХрд╛рд░реНрдпреЛрдВ рдХреЗ рд▓рд┐рдП рдзрдиреНрдпрд╡рд╛рджред рдореЗрд░реА рдиреМрдХрд░реА рдХрд╛ 90% dplyr рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░ рд░рд╣рд╛ рд╣реИред : )

рдореИрдВ @huftis рд╕реЗ рдкреВрд░реА рддрд░рд╣ рд╕рд╣рдордд рд╣реВрдВред

рдореБрдЭреЗ рдирд╣реАрдВ рд▓рдЧрддрд╛ рдХрд┐ рд╕реНрддрд░реЛрдВ рдХреЗ рдЧрд┐рд░рдиреЗ рдпрд╛ рд╕реНрддрд░реЛрдВ рдХреЗ рд╕рдВрдпреЛрдЬрди рдХрд╛ рдбреЗрдЯрд╛ рд╕реЗ рдХреЛрдИ рд▓реЗрдирд╛-рджреЗрдирд╛ рд╣реЛрдирд╛ рдЪрд╛рд╣рд┐рдПред рд╣реЛ рд╕рдХрддрд╛ рд╣реИ рдХрд┐ рдЖрдк рдПрдХ рдЫреЛрдЯреЗ рд╕реЗ рдирдореВрдиреЗ рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рдХреЗ рдХрд┐рд╕реА рдлрд╝рдВрдХреНрд╢рди рдпрд╛ рдЖрдХреГрддрд┐ рдХрд╛ рдкреНрд░реЛрдЯреЛрдЯрд╛рдЗрдк рдмрдирд╛ рд░рд╣реЗ рд╣реЛрдВред рдпрд╛ рд╕реНрдкреНрд▓рд┐рдЯ-рдЕрдкреНрд▓рд╛рдИ-рдХрдореНрдмрд╛рдЗрди рдСрдкрд░реЗрд╢рди рдХрд░рддреЗ рд╣реБрдП, рдЬрд┐рд╕ рд╕реНрдерд┐рддрд┐ рдореЗрдВ рдЖрдк рдПрдХ рдЧрд╛рд░рдВрдЯреА рдЪрд╛рд╣рддреЗ рд╣реИрдВ рдХрд┐ рдкреНрд░рддреНрдпреЗрдХ рд╕рдореВрд╣ рдХрд╛ рдЖрдЙрдЯрдкреБрдЯ рдмрд╛рдХреА рд╕рднреА рдХреЗ рдЕрдиреБрд░реВрдк рд╣реЛрдЧрд╛ред

рдореЗрд░реА рд╕реНрдерд┐рддрд┐ рдХреЛ рдирд░рдо рдХрд░рдирд╛: рдореБрдЭреЗ рд▓рдЧрддрд╛ рд╣реИ рдХрд┐ рдпрд╣ рд╡рд┐рдЪрд╛рд░ рдХрд░рдиреЗ рдпреЛрдЧреНрдп рд╣реИ рдХрд┐ рдХреНрдпрд╛ рдбрд┐рдлрд╝реЙрд▓реНрдЯ рд╡реНрдпрд╡рд╣рд╛рд░ рднрд┐рдиреНрди рд╣реЛрдирд╛ рдЪрд╛рд╣рд┐рдП рдЬрдм рд╕рдореВрд╣ рдЪрд░ рдкрд╣рд▓реЗ рд╕реЗ рд╣реА рдПрдХ рдЙрдЪрд┐рдд рдХрд╛рд░рдХ рд╣реИ рдмрдирд╛рдо рдЬрдм рдЗрд╕реЗ рдХрд╛рд░рдХ рдХреЗ рд▓рд┐рдП рдордЬрдмреВрд░ рдХрд┐рдпрд╛ рдЬрд╛ рд░рд╣рд╛ рд╣реЛред рдореИрдВ рджреЗрдЦ рд╕рдХрддрд╛ рд╣реВрдВ рдХрд┐ рдЬрдмрд░рджрд╕реНрддреА рдХреЗ рдорд╛рдорд▓реЗ рдореЗрдВ рдЕрдкреНрд░рдпреБрдХреНрдд рд╕реНрддрд░реЛрдВ рдХреЛ рд░рдЦрдиреЗ рдХреА рдмрд╛рдзреНрдпрддрд╛ рдХрдо рд╣реЛ рд╕рдХрддреА рд╣реИред рд▓реЗрдХрд┐рди рдЕрдЧрд░ рдореИрдВ рдХрд┐рд╕реА рдЪреАрдЬрд╝ рдХреЛ рдПрдХ рдХрд╛рд░рдХ рдХреЗ рд░реВрдк рдореЗрдВ рд╕реНрдерд╛рдкрд┐рдд рдХрд░рдиреЗ рдФрд░ рд╕реНрддрд░реЛрдВ рдХреЛ рдирд┐рдпрдВрддреНрд░рд┐рдд рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рдореБрд╕реАрдмрдд рдореЗрдВ рдкрдбрд╝ рдЧрдпрд╛ рд╣реВрдБ ... рддреЛ рдЖрдорддреМрд░ рдкрд░ рдПрдХ рдЕрдЪреНрдЫрд╛ рдХрд╛рд░рдг рд╣реЛрддрд╛ рд╣реИ рдФрд░ рдореИрдВ рдЗрд╕реЗ рдмрдирд╛рдП рд░рдЦрдиреЗ рдХреЗ рд▓рд┐рдП рд▓рдЧрд╛рддрд╛рд░ рд╕рдВрдШрд░реНрд╖ рдирд╣реАрдВ рдХрд░рдирд╛ рдЪрд╛рд╣рддрд╛ред

FYIW, рдореИрдВ рдЗрд╕ рд╕реБрд╡рд┐рдзрд╛ рдХреЛ рднреА рджреЗрдЦрдирд╛ рдЪрд╛рд╣реВрдВрдЧрд╛ред рдореЗрд░реЗ рдкрд╛рд╕ рдПрдХ рд╕рдорд╛рди рдкрд░рд┐рджреГрд╢реНрдп рд╣реИ рдЬреИрд╕рд╛ рдХрд┐ @huftis рджреНрд╡рд╛рд░рд╛ рд╡рд░реНрдгрд┐рдд рд╣реИ рдФрд░ рдореБрдЭреЗ рдЖрд╡рд╢реНрдпрдХ рдкрд░рд┐рдгрд╛рдо рдкреНрд░рд╛рдкреНрдд рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рд╣реБрдкреНрд╕ рдХреЗ рдорд╛рдзреНрдпрдо рд╕реЗ рдХреВрджрдирд╛ рд╣реИред

рдПрд╕рдУ рд╕реЗ рдпрд╣рд╛рдВ рдЖрдпрд╛ рдерд╛ред рдХреНрдпрд╛ рдпрд╣ "tidyr" рд╕реЗ complete рдорджрдж рдХрд░рдиреЗ рд╡рд╛рд▓рд╛ рдирд╣реАрдВ рд╣реИ?

рд╣рд╛рдБ рдРрд╕рд╛ рд╣реЛрддрд╛ рд╣реИред рдореИрдВрдиреЗ рд╡рд╛рд╕реНрддрд╡ рдореЗрдВ рд╣рд╛рд▓ рд╣реА рдореЗрдВ 'рдкреВрд░реНрдг' рдХреЗ рдмрд╛рд░реЗ рдореЗрдВ рд╕реАрдЦрд╛ рд╣реИ рдФрд░ рдРрд╕рд╛ рд▓рдЧрддрд╛ рд╣реИ рдХрд┐ рдЗрд╕реЗ рдПрдХ рд╡рд┐рдЪрд╛рд░рд╢реАрд▓ рддрд░реАрдХреЗ рд╕реЗ рдкреВрд░рд╛ рдХрд┐рдпрд╛ рдЧрдпрд╛ рд╣реИред

SQL рдмреИрдХрдПрдВрдб рдХреЗ рд▓рд┐рдП рдЗрд╕реЗ рд▓рд╛рдЧреВ рдХрд░рдирд╛ рдореБрд╢реНрдХрд┐рд▓ рд▓рдЧрддрд╛ рд╣реИ, рдХреНрдпреЛрдВрдХрд┐ рд╡реЗ рдбрд┐рдлрд╝реЙрд▓реНрдЯ рд░реВрдк рд╕реЗ рд╕рднреА рд╕рдореВрд╣реЛрдВ рдХреЛ рдЫреЛрдбрд╝ рджреЗрдВрдЧреЗред рдХреНрдпрд╛ рд╣рдо рдЗрд╕реЗ рдЙрд╕ рдкрд░ рдЫреЛрдбрд╝ рджреЗрдВ рдФрд░ рд╢рд╛рдпрдж SQL рдХреЗ рд▓рд┐рдП tidyr::complete() рд▓рд╛рдЧреВ рдХрд░реЗрдВ?

рдореИрдВрдиреЗ рдореБрджреНрджрд╛ # 3033 рдмрдирд╛рдпрд╛ рд╣реИ, рдпрд╣ рдорд╣рд╕реВрд╕ рдирд╣реАрдВ рдХрд░ рд░рд╣рд╛ рд╣реИ рдХрд┐ рдпрд╣ рд╕рдорд╕реНрдпрд╛ рдкрд╣рд▓реЗ рд╕реЗ рдореМрдЬреВрдж рд╣реИ - рдбреБрдкреНрд▓рд┐рдХреЗрдЯ рдХреЗ рд▓рд┐рдП рдЦреЗрдж рд╣реИред рдЕрдкрдирд╛ рд╡рд┐рдирдореНрд░ рд╕реБрдЭрд╛рд╡ рдЬреЛрдбрд╝рдиреЗ рдХреЗ рд▓рд┐рдП, рдореИрдВ рд╡рд░реНрддрдорд╛рди рдореЗрдВ pull() рдФрд░ forcats::fct_count() рдХрд╛ рдЙрдкрдпреЛрдЧ рдЗрд╕ рдореБрджреНрджреЗ рдХреЗ

рдореИрдВ рдЗрд╕ рдкрджреНрдзрддрд┐ рдХрд╛ рдкреНрд░рд╢рдВрд╕рдХ рдирд╣реАрдВ рд╣реВрдВ, рд╣рд╛рд▓рд╛рдВрдХрд┐ fct_count() рдПрдХ рдЖрдЙрдЯрдкреБрдЯ рдмрдирд╛рдиреЗ рдХреЗ tidyverse рд╕рд┐рджреНрдзрд╛рдВрдд рдХреЛ рдзреЛрдЦрд╛ рджреЗрддрд╛ рд╣реИ рдЬреЛ рд╣рдореЗрд╢рд╛ рдЗрдирдкреБрдЯ рдХреЗ рд╕рдорд╛рди рдкреНрд░рдХрд╛рд░ рд╣реЛрддрд╛ рд╣реИ (рдпрд╛рдиреА рдпрд╣ рдлрд╝рдВрдХреНрд╢рди рд╡реЗрдХреНрдЯрд░ рд╕реЗ рдПрдХ рдЯрд┐рдмрд▓ рдмрдирд╛рддрд╛ рд╣реИ), рдФрд░ рдореЗрд░реЗ рдкрд╛рд╕ рд╣реИ рдЖрдЙрдЯрдкреБрдЯ рдореЗрдВ рдХреЙрд▓рдо рдХрд╛ рдирд╛рдо рдмрджрд▓рдиреЗ рдХреЗ рд▓рд┐рдПред рдпрд╣ 3 рдЪрд░рдг рдмрдирд╛рддрд╛ рд╣реИ ( pull() %>% fct_count() %>% rename() ) рдЬрдм dplyr::count() рдПрдХ рдХреЛ рдХрд╡рд░ рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рдерд╛ред рдпрд╣ рд╢рд╛рдирджрд╛рд░ рд╣реЛрдЧрд╛ рдпрджрд┐ forcats::fct_count() рдФрд░ dplyr::count() рдХреЛ рдХрд┐рд╕реА рднреА рддрд░рд╣ рд╕реЗ рд╕рдорд╛рдореЗрд▓рд┐рдд рдХрд┐рдпрд╛ рдЬрд╛ рд╕рдХрддрд╛ рд╣реИ, рдФрд░ forcats::fct_count() рд╣рдЯрд╛ рджрд┐рдпрд╛ рдЬрд╛ рд╕рдХрддрд╛ рд╣реИред

рдХреНрдпрд╛ tidyr::complete() рдХрд╛рд░рдХреЛрдВ рдХреЗ рд▓рд┐рдП рдХрд╛рдо рдХрд░рддрд╛ рд╣реИ?

рдХрд╛рд░рдХ рд╕реНрддрд░реЛрдВ рдХреЗ рд╕рднреА рдХрд╛рд░рдХ рд╕реНрддрд░реЛрдВ рдФрд░ рд╕рдВрдпреЛрдЬрдиреЛрдВ рдХреЛ рдбрд┐рдлрд╝реЙрд▓реНрдЯ рд░реВрдк рд╕реЗ рд╕рдВрд░рдХреНрд╖рд┐рдд рдХрд┐рдпрд╛ рдЬрд╛рдирд╛ рдЪрд╛рд╣рд┐рдПред рдЗрд╕ рд╡реНрдпрд╡рд╣рд╛рд░ рдХреЛ drop , expand , рдЖрджрд┐ рдЬреИрд╕реЗ рдорд╛рдкрджрдВрдбреЛрдВ рджреНрд╡рд╛рд░рд╛ рдирд┐рдпрдВрддреНрд░рд┐рдд рдХрд┐рдпрд╛ рдЬрд╛ рд╕рдХрддрд╛ рд╣реИред рдЗрд╕ рдкреНрд░рдХрд╛рд░ dplyr::count() рдХрд╛ рдбрд┐рдлрд╝реЙрд▓реНрдЯ рд╡реНрдпрд╡рд╣рд╛рд░ рдЗрд╕ рддрд░рд╣ рд╣реЛрдирд╛ рдЪрд╛рд╣рд┐рдП:

df <- data.frame(x = 1:2, y = factor(c(1, 1), levels = 1:2))
df %>% dplyr::count(x, y)
#>  # A tibble: 4 x 3
#>       x        y       n
#>     <int>   <fct>    <int>
#> 1     1        1       1
#> 2     2        1       1
#> 3     1        2       0
#> 4     2        2       0

рд╢реВрдиреНрдп рд▓рдВрдмрд╛рдИ рд╕рдореВрд╣ (рд╕рдореВрд╣реЛрдВ рдХреЗ рд╕рдВрдпреЛрдЬрди) рдХреЛ рдмрд╛рдж рдореЗрдВ рдлрд╝рд┐рд▓реНрдЯрд░ рдХрд┐рдпрд╛ рдЬрд╛ рд╕рдХрддрд╛ рд╣реИред рд▓реЗрдХрд┐рди рдЦреЛрдЬрдкреВрд░реНрдг рд╡рд┐рд╢реНрд▓реЗрд╖рдг рдХреЗ рд▓рд┐рдП рд╣рдореЗрдВ рдкреВрд░реА рддрд╕реНрд╡реАрд░ рджреЗрдЦрдиреА рд╣реЛрдЧреАред

  1. рдХреНрдпрд╛ рдЗрд╕ рдореБрджреНрджреЗ рдХреЗ рд╕рдорд╛рдзрд╛рди рдкрд░ рдХреЛрдИ рд╕реНрдерд┐рддрд┐ рдЕрджреНрдпрддрди рд╣реИ?
  2. рдХреНрдпрд╛ рдЗрд╕ рдореБрджреНрджреЗ рдХреЛ рдкреВрд░реА рддрд░рд╣ рд╕реЗ рд╣рд▓ рдХрд░рдиреЗ рдХреА рдХреЛрдИ рдпреЛрдЬрдирд╛ рд╣реИ?

2: рд╣рд╛рдБ рдирд┐рд╢реНрдЪрд┐рдд рд░реВрдк рд╕реЗ
1: рдЗрд╕ рдореБрджреНрджреЗ рдХреЗ рдмрд╛рд░реЗ рдореЗрдВ рдХреБрдЫ рддрдХрдиреАрдХреА рдХрд╛рд░реНрдпрд╛рдиреНрд╡рдпрди рдХрдард┐рдирд╛рдЗрдпрд╛рдВ рд╣реИрдВ, рд▓реЗрдХрд┐рди рдореИрдВ рдЗрд╕реЗ рдЕрдЧрд▓реЗ рдХреБрдЫ рд╣рдлреНрддреЛрдВ рдореЗрдВ рджреЗрдЦреВрдВрдЧрд╛ред

рддрдереНрдп рдХреЗ рдмрд╛рдж рдбреЗрдЯрд╛ рдХрд╛ рд╡рд┐рд╕реНрддрд╛рд░ рдХрд░рдХреЗ рд╣рдо рдЗрд╕рд╕реЗ рджреВрд░ рд╣реЛ рд╕рдХрддреЗ рд╣реИрдВ, рдРрд╕рд╛ рдХреБрдЫ:

library(tidyverse)

truly_group_by <- function(data, ...){
  dots <- quos(...)
  data <- group_by( data, !!!dots )

  labels <- attr( data, "labels" )
  labnames <- names(labels)
  labels <- mutate( labels, ..index.. =  attr(data, "indices") )

  expanded <- labels %>%
    tidyr::expand( !!!dots ) %>%
    left_join( labels, by = labnames ) %>%
    mutate( ..index.. = map(..index.., ~if(is.null(.x)) integer() else .x ) )

  indices <- pull( expanded, ..index..)
  group_sizes <- map_int( indices, length)
  labels <- select( expanded, -..index..)

  attr(data, "labels")  <- labels
  attr(data, "indices") <- indices
  attr(data, "group_sizes") <- group_sizes

  data
}

df  <- data_frame(
  x = 1:2,
  y = factor(c(1, 1), levels = 1:2)
)
tally( truly_group_by(df, x, y) )
#> # A tibble: 4 x 3
#> # Groups:   x [?]
#>       x y         n
#>   <int> <fct> <int>
#> 1     1 1         1
#> 2     1 2         0
#> 3     2 1         1
#> 4     2 2         0
tally( truly_group_by(df, y, x) )
#> # A tibble: 4 x 3
#> # Groups:   y [?]
#>   y         x     n
#>   <fct> <int> <int>
#> 1 1         1     1
#> 2 1         2     1
#> 3 2         1     0
#> 4 2         2     0

рд╕реНрдкрд╖реНрдЯ рд░реВрдк рд╕реЗ рд▓рд╛рдЗрди рдХреЗ рдиреАрдЪреЗ, рдЗрд╕реЗ рдЖрдВрддрд░рд┐рдХ рд░реВрдк рд╕реЗ рд╕рдВрднрд╛рд▓рд╛ рдЬрд╛рдПрдЧрд╛, рдмрд┐рдирд╛ tidyr рдпрд╛ purrr рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рдХреЗред

рдРрд╕рд╛ рд▓рдЧрддрд╛ рд╣реИ рдХрд┐ рдореВрд▓ рдкреНрд░рд╢реНрди рдХрд╛ рдЦреНрдпрд╛рд▓ рд░рдЦрдирд╛ рд╣реИ:

> df = data.frame(a=rep(1:3,4), b=rep(1:2,6))
> df$b = factor(df$b, levels=1:3)
> df %>%
+   group_by(b) %>%
+   summarise(count_a=length(a), .drop=FALSE)
# A tibble: 2 x 3
  b     count_a .drop
  <fct>   <int> <lgl>
1 1           6 FALSE
2 2           6 FALSE
> df %>%
+   truly_group_by(b) %>%
+   summarise(count_a=length(a), .drop=FALSE)
# A tibble: 3 x 3
  b     count_a .drop
  <fct>   <int> <lgl>
1 1           6 FALSE
2 2           6 FALSE
3 3           0 FALSE

рдпрд╣рд╛рдБ рдХреБрдВрдЬреА рдпрд╣ рд╣реИ

 tidyr::expand( !!!dots ) %>%

рдЬрд┐рд╕рдХрд╛ рдЕрд░реНрде рд╣реИ рд╕рднреА рд╕рдВрднрд╛рд╡рдирд╛рдУрдВ рдХрд╛ рд╡рд┐рд╕реНрддрд╛рд░ рдХрд░рдирд╛, рднрд▓реЗ рд╣реА рдЪрд░ рдХрд╛рд░рдХ рд╣реЛрдВ рдпрд╛ рди рд╣реЛрдВред

рдореИрдВ рдХрд╣реВрдВрдЧрд╛ рдХрд┐ рд╣рдо рдпрд╛ рддреЛ:

  • рд╕рднреА рдХрд╛ рд╡рд┐рд╕реНрддрд╛рд░ рдХрд░реЗрдВ рдЬрдм drop=FALSE , рд╕рдВрднрд╛рд╡рд┐рдд рд░реВрдк рд╕реЗ рдмрд╣реБрдд рд╕рд╛рд░реЗ 0 рд▓рдВрдмрд╛рдИ рд╕рдореВрд╣ рд╣реЛрдВ
  • рдЕрдЧрд░ рд╣рдо drop=TRUE

рд╢рд╛рдпрдж рдбреНрд░реЙрдкрдиреЗрд╕ рдХреЛ рдЯреЙрдЧрд▓ рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рдПрдХ рдлрд╝рдВрдХреНрд╢рди рд╣реИред

рдпрд╣ рдПрдХ рдЕрдкреЗрдХреНрд╖рд╛рдХреГрдд рд╕рд╕реНрддрд╛ рдСрдкрд░реЗрд╢рди рд╣реИ рдЬреЛ рдореИрдВ рдХрд╣реВрдВрдЧрд╛ рдХреНрдпреЛрдВрдХрд┐ рдЗрд╕рдореЗрдВ рдХреЗрд╡рд▓ рдореЗрдЯрд╛рдбреЗрдЯрд╛ рдореЗрдВ рд╣реЗрд░рдлреЗрд░ рдХрд░рдирд╛ рд╢рд╛рдорд┐рд▓ рд╣реИ, рдЗрд╕рд▓рд┐рдП рд╢рд╛рдпрдж рдкрд╣рд▓реЗ рдЖрд░ рдореЗрдВ рдРрд╕рд╛ рдХрд░рдирд╛ рдХрдо рдЬреЛрдЦрд┐рдо рднрд░рд╛ рд╣реИ?

рдХреНрдпрд╛ рдЖрдкрдХрд╛ рдорддрд▓рдм crossing() рдмрдЬрд╛рдп expand() ?

рдЗрдВрдЯрд░реНрдирд▓ рдХреЛ рджреЗрдЦрддреЗ рд╣реБрдП, рдХреНрдпрд╛ рдЖрдк рд╕рд╣рдордд рд╣реИрдВ рдХрд┐ рдРрд╕рд╛ рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рд╣рдореЗрдВ "рдХреЗрд╡рд▓" build_index_cpp() , рд╡рд┐рд╢реЗрд╖ рд░реВрдк рд╕реЗ labels рдбреЗрдЯрд╛ рдлреНрд░реЗрдо рдХреА рдкреАрдврд╝реА рдХреЛ рдмрджрд▓рдиреЗ рдХреА рдЖрд╡рд╢реНрдпрдХрддрд╛ рд╣реИ?

рдХреНрдпрд╛ рд╣рдо рд╢рд╛рдпрдж drop = FALSE рд╕рд╛рде рдХреЗрд╡рд▓ рдХрд╛рд░рдХреЛрдВ рдХреЗ рд╡рд┐рд╕реНрддрд╛рд░ рдХреЗ рд╕рд╛рде рд╢реБрд░реБрдЖрдд рдХрд░ рд╕рдХрддреЗ рд╣реИрдВ? рдореИрдВрдиреЗ рдПрдХ "рдкреНрд░рд╛рдХреГрддрд┐рдХ" рд╡рд╛рдХреНрдпрд╡рд┐рдиреНрдпрд╛рд╕ рдорд╛рдирд╛, рд▓реЗрдХрд┐рди рдпрд╣ рдЕрдВрдд рдореЗрдВ рдмрд╣реБрдд рднреНрд░рдорд┐рдд рд╣реЛ рд╕рдХрддрд╛ рд╣реИ (рдФрд░ рд╢рд╛рдпрдж рдкрд░реНрдпрд╛рдкреНрдд рд╢рдХреНрддрд┐рд╢рд╛рд▓реА рднреА рдирд╣реАрдВ):

group_by(data, crossing(col1, col2), col3)

рд╕рд┐рдореЗрдВрдЯрд┐рдХреНрд╕: col1 рдФрд░ col2 рд╕рднреА рд╕рдВрдпреЛрдЬрдиреЛрдВ рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рдирд╛, рдФрд░ col3 рд╕рд╛рде рдореМрдЬреВрджрд╛ рд╕рдВрдпреЛрдЬрди рд╣реИрдВред

рд╣рд╛рдВ, рдореИрдВ рдХрд╣реВрдВрдЧрд╛ рдХрд┐ рдпрд╣ рдХреЗрд╡рд▓ build_index_cpp рдФрд░ рд╡рд┐рд╢реЗрд╖рддрд╛рдУрдВ рдХреА рдкреАрдврд╝реА рдХреЛ рдкреНрд░рднрд╛рд╡рд┐рдд рдХрд░рддрд╛ рд╣реИ labels , indices рдФрд░ group_sizes рдЬрд┐рд╕реЗ рдореИрдВ рдПрдХ рдореЗрдВ рд╕реНрдХреНрд╡реИрд╢ рдХрд░рдирд╛ рдЪрд╛рд╣рддрд╛ рд╣реВрдВ #3489 . рдХреЗ рд╣рд┐рд╕реНрд╕реЗ рдХреЗ рд░реВрдк рдореЗрдВ рд╕реБрд╡реНрдпрд╡рд╕реНрдерд┐рдд рд╕рдВрд░рдЪрдирд╛

рдЗрд╕ рдЪрд░реНрдЪрд╛ рдХрд╛ "рдХреЗрд╡рд▓ рд╡рд┐рд╕реНрддрд╛рд░ рдХрд░рдиреЗ рд╡рд╛рд▓реЗ рдХрд╛рд░рдХ" рд╣рд┐рд╕реНрд╕реЗ рдореЗрдВ рдЗрддрдирд╛ рд╕рдордп рд▓рдЧрд╛ред

рдЗрдирдХреЗ рдкрд░рд┐рдгрд╛рдо рдХреНрдпрд╛ рд╣реЛрдВрдЧреЗ:

library(dplyr)

d <- data_frame(
  f1 = factor( rep( c("a", "b"), each = 4 ), levels = c("a", "b", "c") ),
  f2 = factor( rep( c("d", "e", "f", "g"), each = 2 ), levels = c("d", "e", "f", "g", "h") ),
  x  = 1:8,
  y  = rep( 1:4, each = 2)
)

f <- function(data, ...){
  group_by(data, !!!quos(...))  %>%
    tally()
}
f(d, f1, f2, x)
f(d, x, f1, f2)

f(d, f1, f2, x, y)
f(d, x, f1, f2, y)

рдореБрдЭреЗ рд▓рдЧрддрд╛ рд╣реИ рдХрд┐ f(d, f1, f2, x) рдХреЛ f(d, x, f1, f2) рдХреЗ рд╕рдорд╛рди рдкрд░рд┐рдгрд╛рдо рджреЗрдирд╛ рдЪрд╛рд╣рд┐рдП, рдпрджрд┐ рдкрдВрдХреНрддрд┐ рдХреНрд░рдо рдХреЛ рдЕрдирджреЗрдЦрд╛ рдХрд┐рдпрд╛ рдЬрд╛рддрд╛ рд╣реИред рдмрд╛рдХреА рджреЛ рдХреЗ рд▓рд┐рдП рднреА рд╕рдорд╛рдиред

рдпрд╣ рднреА рджрд┐рд▓рдЪрд╕реНрдк:

f(d, f2, x, f1, y)
d %>% sample_frac(0.3) %>% f(...)

рдореБрдЭреЗ рдХреЗрд╡рд▓ рдХрд╛рд░рдХреЛрдВ рдХреЗ рд▓рд┐рдП рдкреВрд░реНрдг рд╡рд┐рд╕реНрддрд╛рд░ рд▓рд╛рдЧреВ рдХрд░рдиреЗ рдХрд╛ рд╡рд┐рдЪрд╛рд░ рдкрд╕рдВрдж рд╣реИред рдЧреИрд░-рдЪрд░рд┐рддреНрд░ рдбреЗрдЯрд╛ (рддрд╛рд░реНрдХрд┐рдХ рд╕рд╣рд┐рдд) рдХреЗ рд▓рд┐рдП, рд╣рдо рдПрдХ рдХрд╛рд░рдХ-рд╕рдорд╛рди рд╡рд░реНрдЧ рдХреЛ рдкрд░рд┐рднрд╛рд╖рд┐рдд/рдЙрдкрдпреЛрдЧ рдХрд░ рд╕рдХрддреЗ рд╣реИрдВ рдЬреЛ рд╕рдВрдмрдВрдзрд┐рдд рдбреЗрдЯрд╛ рдкреНрд░рдХрд╛рд░ рдХреЛ рдкреНрд░рд╛рдкреНрдд рдХрд░рддрд╛ рд╣реИред рд╢рд╛рдпрдж forcats рджреНрд╡рд╛рд░рд╛ рдкреНрд░рджрд╛рди рдХрд┐рдпрд╛

#3492 . рдореЗрдВ рдХрд╛рд░реНрдпрд╛рдиреНрд╡рдпрди рдкреНрд░рдЧрддрд┐ рдкрд░ рд╣реИ

library(dplyr)
#> 
#> Attaching package: 'dplyr'
#> The following objects are masked from 'package:stats':
#> 
#>     filter, lag
#> The following objects are masked from 'package:base':
#> 
#>     intersect, setdiff, setequal, union
df <- data_frame( f = factor( c(1,1,2,2), levels = 1:3), x = c(1,2,1,4) )

( res1 <- tally(group_by(df,f,x, drop = FALSE)) )
#> # A tibble: 9 x 3
#> # Groups:   f [?]
#>   f         x     n
#>   <fct> <dbl> <int>
#> 1 1        1.     1
#> 2 1        2.     1
#> 3 1        4.     0
#> 4 2        1.     1
#> 5 2        2.     0
#> 6 2        4.     1
#> 7 3        1.     0
#> 8 3        2.     0
#> 9 3        4.     0
( res2 <- tally(group_by(df,x,f, drop = FALSE)) )
#> # A tibble: 9 x 3
#> # Groups:   x [?]
#>       x f         n
#>   <dbl> <fct> <int>
#> 1    1. 1         1
#> 2    1. 2         1
#> 3    1. 3         0
#> 4    2. 1         1
#> 5    2. 2         0
#> 6    2. 3         0
#> 7    4. 1         0
#> 8    4. 2         1
#> 9    4. 3         0

all.equal( res1, arrange(res2, f, x) )
#> [1] TRUE

all.equal( filter(res1, n>0), tally(group_by(df, f, x)) )
#> [1] TRUE
all.equal( filter(res2, n>0), tally(group_by(df, x, f)) )
#> [1] TRUE

рд░реЗрдкреНрд░реЗрдХреНрд╕ рдкреИрдХреЗрдЬ (

рдЬреИрд╕реЗ рдХрд┐ complete() рдЗрд╕ рдореБрджреНрджреЗ рдХреЛ рд╣рд▓ рдХрд░рддрд╛ рд╣реИ - рдирд╣реАрдВ, рд╡рд╛рд╕реНрддрд╡ рдореЗрдВ рдирд╣реАрдВред рдЬреЛ рднреА рд╕рд╛рд░рд╛рдВрд╢ рдХреА рдЧрдгрдирд╛ рдХреА рдЬрд╛ рд░рд╣реА рд╣реИ, рдЦрд╛рд▓реА рд╡реИрдХреНрдЯрд░ рдкрд░ рдЙрдирдХреЗ рд╡реНрдпрд╡рд╣рд╛рд░ рдХреЛ рд╕рдВрд░рдХреНрд╖рд┐рдд рдХрд░рдиреЗ рдХреА рдЖрд╡рд╢реНрдпрдХрддрд╛ рд╣реИ, рди рдХрд┐ рддрдереНрдп рдХреЗ рдмрд╛рдж рдкреИрдЪ рдЕрдк рдХрд░рдиреЗ рдХреАред рдЙрджрд╛рд╣рд░рдг рдХреЗ рд▓рд┐рдП:

data.frame(x=factor(1, levels=1:2), y=4:5) %>%
     group_by(x) %>%
     summarize(min=min(y), sum=sum(y), prod=prod(y))
# Should be:
#> x       min   sum  prod
#> 1         4     9    20
#> 2       Inf     0     1

sum рдФрд░ prod (рдФрд░ рдХреБрдЫ рд╣рдж рддрдХ, min ) (рдФрд░ рдХрдИ рдЕрдиреНрдп рдХрд╛рд░реНрдпреЛрдВ) рдореЗрдВ рдЦрд╛рд▓реА рд╡реИрдХреНрдЯрд░ рдкрд░ рдмрд╣реБрдд рдЕрдЪреНрдЫреА рддрд░рд╣ рд╕реЗ рдкрд░рд┐рднрд╛рд╖рд┐рдд рд╢рдмреНрджрд╛рд░реНрде рд╣реИрдВ, рдФрд░ рдпрд╣ рдмрд╣реБрдд рдЕрдЪреНрдЫрд╛ рдирд╣реАрдВ рд╣реИ рдмрд╛рдж рдореЗрдВ complete() рд╕рд╛рде рдЖрдПрдВ рдФрд░ рдЙрди рд╡реНрдпрд╡рд╣рд╛рд░реЛрдВ рдХреЛ рдлрд┐рд░ рд╕реЗ рдкрд░рд┐рднрд╛рд╖рд┐рдд рдХрд░реЗрдВред

@kenahoo рдореБрдЭреЗ рдпрдХреАрди рдирд╣реАрдВ рд╣реИ рдХрд┐ рдореИрдВ рд╕рдордЭрддрд╛ рд╣реВрдВред рдпрд╣ рд╡рд╣реА рд╣реИ рдЬреЛ рдЖрдкрдХреЛ рд╡рд░реНрддрдорд╛рди рджреЗрд╡ рд╕рдВрд╕реНрдХрд░рдг рдХреЗ рд╕рд╛рде рдорд┐рд▓рддрд╛ рд╣реИред рддреЛ рдХреЗрд╡рд▓ рдПрдХ рдЪреАрдЬ рдЬреЛ рдЖрдкрдХреЛ рдирд╣реАрдВ рдорд┐рд▓рддреА рд╡рд╣ рд╣реИ min() рд╕реЗ рдЪреЗрддрд╛рд╡рдиреА

library(dplyr)

data.frame(x=factor(1, levels=1:2), y=4:5) %>%
  group_by(x) %>%
  summarize(min=min(y), sum=sum(y), prod=prod(y))
#> # A tibble: 2 x 4
#>   x       min   sum  prod
#>   <fct> <dbl> <int> <dbl>
#> 1 1         4     9    20
#> 2 2       Inf     0     1

min(integer())
#> Warning in min(integer()): no non-missing arguments to min; returning Inf
#> [1] Inf
sum(integer())
#> [1] 0
prod(integer())
#> [1] 1

рд░реЗрдкреНрд░реЗрдХреНрд╕ рдкреИрдХреЗрдЬ (

@romainfrancois рдУрд╣ рдХреВрд▓, рдореБрдЭреЗ рдирд╣реАрдВ рдкрддрд╛ рдерд╛ рдХрд┐ рдЖрдк рдЗрд╕ рдХрд╛рд░реНрдпрд╛рдиреНрд╡рдпрди рдкрд░ рдкрд╣рд▓реЗ рд╕реЗ рд╣реА рдмрд╣реБрдд рджреВрд░ рдереЗред рдЕрдЪреНрдЫрд╛ рд▓рдЧ рд░рд╣рд╛ рд╣реИ!

рдпрд╣ рдкреБрд░рд╛рдирд╛ рдЗрд╢реНрдпреВ рдЕрдкрдиреЗ рдЖрдк рд▓реЙрдХ рд╣реЛ рдЧрдпрд╛ рд╣реИред рдпрджрд┐ рдЖрдкрдХреЛ рд▓рдЧрддрд╛ рд╣реИ рдХрд┐ рдЖрдкрдХреЛ рдХреЛрдИ рд╕рдВрдмрдВрдзрд┐рдд рд╕рдорд╕реНрдпрд╛ рдорд┐рд▓реА рд╣реИ, рддреЛ рдХреГрдкрдпрд╛ рдПрдХ рдирдпрд╛ рдореБрджреНрджрд╛ (рд░реЗрдкреНрд░реЗрдХреНрд╕ рдХреЗ рд╕рд╛рде) рджрд░реНрдЬ рдХрд░реЗрдВ рдФрд░ рдЗрд╕ рдореБрджреНрджреЗ рд╕реЗ рд▓рд┐рдВрдХ рдХрд░реЗрдВред https://reprex.tidyverse.org/

рдХреНрдпрд╛ рдпрд╣ рдкреГрд╖реНрда рдЙрдкрдпреЛрдЧреА рдерд╛?
0 / 5 - 0 рд░реЗрдЯрд┐рдВрдЧреНрд╕

рд╕рдВрдмрдВрдзрд┐рдд рдореБрджреНрджреЛрдВ

NightWinkle picture NightWinkle  ┬╖  3рдЯрд┐рдкреНрдкрдгрд┐рдпрд╛рдБ

lazarillo picture lazarillo  ┬╖  5рдЯрд┐рдкреНрдкрдгрд┐рдпрд╛рдБ

tjmahr picture tjmahr  ┬╖  4рдЯрд┐рдкреНрдкрдгрд┐рдпрд╛рдБ

Prometheus77 picture Prometheus77  ┬╖  4рдЯрд┐рдкреНрдкрдгрд┐рдпрд╛рдБ

chrislad picture chrislad  ┬╖  5рдЯрд┐рдкреНрдкрдгрд┐рдпрд╛рдБ