рдЖрд░ рдкреЕрдХреЗрдЬ tidyr рдЖрдгрд┐ рддреНрдпрд╛рдЪреА рдирд╡реАрди рдХрд╛рд░реНрдпреЗ pivot_longer рдЖрдгрд┐ pivot_wider

рдкреЕрдХреЗрдЬ рд╡реНрдпрд╡рд╕реНрдерд┐рдд R рднрд╛рд╖реЗрддреАрд▓ рд╕рд░реНрд╡рд╛рдд рд▓реЛрдХрдкреНрд░рд┐рдп рд▓рд╛рдпрдмреНрд░рд░реАрдВрдкреИрдХреА рдПрдХрд╛рдордзреНрдпреЗ рд╕рдорд╛рд╡рд┐рд╖реНрдЯ рдЖрд╣реЗ - рдиреАрдЯрдиреЗрдЯрдХрд╛.
рдкреЕрдХреЗрдЬрдЪрд╛ рдореБрдЦреНрдп рдЙрджреНрджреЗрд╢ рдбреЗрдЯрд╛ рдЕрдЪреВрдХ рд╕реНрд╡рд░реВрдкрд╛рдд рдЖрдгрдгреЗ рд╣рд╛ рдЖрд╣реЗ.

Habr├й рд╡рд░ рдЖрдзреАрдЪ рдЙрдкрд▓рдмреНрдз рдЖрд╣реЗ рдкреНрд░рдХрд╛рд╢рди рдпрд╛ рдкреЕрдХреЗрдЬрд╕рд╛рдареА рд╕рдорд░реНрдкрд┐рдд рдЖрд╣реЗ, рдкрд░рдВрддреБ рддреЗ 2015 рдЪреЗ рдЖрд╣реЗ. рдЖрдгрд┐ рдорд▓рд╛ рддреБрдореНрд╣рд╛рд▓рд╛ рд╕рд░реНрд╡рд╛рдд рд╡рд░реНрддрдорд╛рди рдмрджрд▓рд╛рдВрдмрджреНрджрд▓ рд╕рд╛рдВрдЧрд╛рдпрдЪреЗ рдЖрд╣реЗ, рдЬреЗ рдХрд╛рд╣реА рджрд┐рд╡рд╕рд╛рдВрдкреВрд░реНрд╡реА рддреНрдпрд╛рдЪреЗ рд▓реЗрдЦрдХ рд╣реЗрдбрд▓реА рд╡рд┐рдХрд╣реЕрдо рдпрд╛рдВрдиреА рдЬрд╛рд╣реАрд░ рдХреЗрд▓реЗ рд╣реЛрддреЗ.

рдЖрд░ рдкреЕрдХреЗрдЬ tidyr рдЖрдгрд┐ рддреНрдпрд╛рдЪреА рдирд╡реАрди рдХрд╛рд░реНрдпреЗ pivot_longer рдЖрдгрд┐ pivot_wider

рдПрд╕рдЬреЗрдХреЗ: gather() рдЖрдгрд┐ spread() рдирд╛рдкрд╕рдВрдд рдХреЗрд▓реЗ рдЬрд╛рдИрд▓?

рд╣реЕрдбрд▓реА рд╡рд┐рдХрд╣реЕрдо: рдХрд╛рд╣реА рдкреНрд░рдорд╛рдгрд╛рдд. рдЖрдореНрд╣реА рдпрд╛рдкреБрдвреЗ рдпрд╛ рдлрдВрдХреНрд╢рдиреНрд╕рдЪреНрдпрд╛ рд╡рд╛рдкрд░рд╛рдЪреА рд╢рд┐рдлрд╛рд░рд╕ рдХрд░рдгрд╛рд░ рдирд╛рд╣реА рдЖрдгрд┐ рддреНрдпрд╛рдордзреАрд▓ рджреЛрд╖ рджреВрд░ рдХрд░рдгрд╛рд░ рдирд╛рд╣реА, рдкрд░рдВрддреБ рддреЗ рддреНрдпрд╛рдВрдЪреНрдпрд╛ рд╕рдзреНрдпрд╛рдЪреНрдпрд╛ рд╕реНрдерд┐рддреАрдд рдкреЕрдХреЗрдЬрдордзреНрдпреЗ рдЙрдкрд╕реНрдерд┐рдд рд░рд╛рд╣рддреАрд▓.

рд╕рд╛рдордЧреНрд░реА

рддреБрдореНрд╣рд╛рд▓рд╛ рдбреЗрдЯрд╛ рд╡рд┐рд╢реНрд▓реЗрд╖рдгрд╛рдордзреНрдпреЗ рд╕реНрд╡рд╛рд░рд╕реНрдп рдЕрд╕рд▓реНрдпрд╛рд╕, рддреБрдореНрд╣рд╛рд▓рд╛ рдорд╛рдЭреНрдпрд╛рдордзреНрдпреЗ рд╕реНрд╡рд╛рд░рд╕реНрдп рдЕрд╕реЗрд▓ рддрд╛рд░ ╨╕ YouTube рдЪреЕрдиреЗрд▓ рдмрд╣реБрддреЗрдХ рд╕рд╛рдордЧреНрд░реА рдЖрд░ рднрд╛рд╖реЗрд▓рд╛ рд╕рдорд░реНрдкрд┐рдд рдЖрд╣реЗ.

рд╡реНрдпрд╡рд╕реНрдерд┐рдд рдбреЗрдЯрд╛ рд╕рдВрдХрд▓реНрдкрдирд╛

рдЧреЛрд▓ рд╡реНрдпрд╡рд╕реНрдерд┐рдд тАФ рддреБрдореНрд╣рд╛рд▓рд╛ рдбреЗрдЯрд╛ рдПрдХрд╛ рддрдерд╛рдХрдерд┐рдд рд╡реНрдпрд╡рд╕реНрдерд┐рдд рд╕реНрд╡рд░реВрдкрд╛рдд рдЖрдгрдгреНрдпрд╛рдд рдорджрдд рдХрд░рд╛. рдиреАрдЯ рдбреЗрдЯрд╛ рдЕрд╕рд╛ рдбреЗрдЯрд╛ рдЖрд╣реЗ рдЬреЗрдереЗ:

  • рдкреНрд░рддреНрдпреЗрдХ рд╡реНрд╣реЗрд░рд┐рдПрдмрд▓ рдПрдХрд╛ рд╕реНрддрдВрднрд╛рдд рдЖрд╣реЗ.
  • рдкреНрд░рддреНрдпреЗрдХ рдирд┐рд░реАрдХреНрд╖рдг рдПрдХ рд╕реНрдЯреНрд░рд┐рдВрдЧ рдЖрд╣реЗ.
  • рдкреНрд░рддреНрдпреЗрдХ рдореВрд▓реНрдп рдПрдХ рд╕реЗрд▓ рдЖрд╣реЗ.

рд╡рд┐рд╢реНрд▓реЗрд╖рдг рдЖрдпреЛрдЬрд┐рдд рдХрд░рддрд╛рдирд╛ рдиреАрдЯрдиреЗрдЯрдХрд╛ рдбреЗрдЯрд╛рдордзреНрдпреЗ рд╕рд╛рджрд░ рдХреЗрд▓реЗрд▓реНрдпрд╛ рдбреЗрдЯрд╛рд╕рд╣ рдХрд╛рд░реНрдп рдХрд░рдгреЗ рдЦреВрдк рд╕реЛрдкреЗ рдЖрдгрд┐ рдЕрдзрд┐рдХ рд╕реЛрдпреАрд╕реНрдХрд░ рдЖрд╣реЗ.

tidyr рдкреЕрдХреЗрдЬрдордзреНрдпреЗ рдореБрдЦреНрдп рдХрд╛рд░реНрдпреЗ рд╕рдорд╛рд╡рд┐рд╖реНрдЯ рдЖрд╣реЗрдд

tidyr рдордзреНрдпреЗ рд╕рд╛рд░рдгреНрдпрд╛рдВрдЪреЗ рд░реВрдкрд╛рдВрддрд░ рдХрд░рдгреНрдпрд╛рд╕рд╛рдареА рдбрд┐рдЭрд╛рдЗрди рдХреЗрд▓реЗрд▓реНрдпрд╛ рдлрдВрдХреНрд╢рдиреНрд╕рдЪрд╛ рд╕рдВрдЪ рдЖрд╣реЗ:

  • fill() - рдорд╛рдЧреАрд▓ рдореВрд▓реНрдпрд╛рдВрд╕рд╣ рд╕реНрддрдВрднрд╛рдд рдЧрд╣рд╛рд│ рдореВрд▓реНрдпреЗ рднрд░рдгреЗ;
  • separate() тАФ рд╡рд┐рднрд╛рдЬрдХ рд╡рд╛рдкрд░реВрди рдПрдХ рдлреАрд▓реНрдб рдЕрдиреЗрдХрд╛рдВрдордзреНрдпреЗ рд╡рд┐рднрд╛рдЬрд┐рдд рдХрд░рддреЗ;
  • unite() тАФ рдлрдВрдХреНрд╢рдирдЪреА рд╡реНрдпрд╕реНрдд рдХреНрд░рд┐рдпрд╛, рдПрдХрд╛рдордзреНрдпреЗ рдЕрдиреЗрдХ рдлреАрд▓реНрдб рдПрдХрддреНрд░ рдХрд░рдгреНрдпрд╛рдЪреЗ рдСрдкрд░реЗрд╢рди рдХрд░рддреЗ separate();
  • pivot_longer() тАФ рдПрдХ рдлрдВрдХреНрд╢рди рдЬреЗ рдбреЗрдЯрд╛рд▓рд╛ рд╡рд╛рдЗрдб рдлреЙрд░рдореЕрдЯрдордзреВрди рд▓рд╛рдБрдЧ рдлреЙрд░рдореЕрдЯрдордзреНрдпреЗ рд░реВрдкрд╛рдВрддрд░рд┐рдд рдХрд░рддреЗ;
  • pivot_wider() - рдПрдХ рдлрдВрдХреНрд╢рди рдЬреЗ рдбреЗрдЯрд╛ рд▓рд╛рдБрдЧ рдлреЙрд░рдореЕрдЯрдордзреВрди рд░реБрдВрдж рдлреЙрд░рдореЕрдЯрдордзреНрдпреЗ рд░реВрдкрд╛рдВрддрд░рд┐рдд рдХрд░рддреЗ. рдлрдВрдХреНрд╢рдирджреНрд╡рд╛рд░реЗ рдХреЗрд▓реЗрд▓реНрдпрд╛ рдПрдХрд╛рдЪреЗ рдЙрд▓рдЯ рдСрдкрд░реЗрд╢рди pivot_longer().
  • gather()рдХрд╛рд▓рдмрд╛рд╣реНрдп тАФ рдПрдХ рдлрдВрдХреНрд╢рди рдЬреЗ рдбреЗрдЯрд╛рд▓рд╛ рд╡рд╛рдЗрдб рдлреЙрд░рдореЕрдЯрдордзреВрди рд▓рд╛рдБрдЧ рдлреЙрд░рдореЕрдЯрдордзреНрдпреЗ рд░реВрдкрд╛рдВрддрд░рд┐рдд рдХрд░рддреЗ;
  • spread()рдХрд╛рд▓рдмрд╛рд╣реНрдп - рдПрдХ рдлрдВрдХреНрд╢рди рдЬреЗ рдбреЗрдЯрд╛ рд▓рд╛рдБрдЧ рдлреЙрд░рдореЕрдЯрдордзреВрди рд░реБрдВрдж рдлреЙрд░рдореЕрдЯрдордзреНрдпреЗ рд░реВрдкрд╛рдВрддрд░рд┐рдд рдХрд░рддреЗ. рдлрдВрдХреНрд╢рдирджреНрд╡рд╛рд░реЗ рдХреЗрд▓реЗрд▓реНрдпрд╛ рдПрдХрд╛рдЪреЗ рдЙрд▓рдЯ рдСрдкрд░реЗрд╢рди gather().

рдбреЗрдЯрд╛ рд░реБрдВрдж рд╡рд░реВрди рд▓рд╛рдВрдм рдлреЙрд░рдореЕрдЯрдордзреНрдпреЗ рд░реВрдкрд╛рдВрддрд░рд┐рдд рдХрд░рдгреНрдпрд╛рд╕рд╛рдареА рдирд╡реАрди рд╕рдВрдХрд▓реНрдкрдирд╛ рдЖрдгрд┐ рддреНрдпрд╛рдЙрд▓рдЯ

рдкреВрд░реНрд╡реА, рдЕрд╢рд╛ рдкреНрд░рдХрд╛рд░рдЪреНрдпрд╛ рдкрд░рд┐рд╡рд░реНрддрдирд╛рд╕рд╛рдареА рдлрдВрдХреНрд╢рдиреНрд╕ рд╡рд╛рдкрд░рд▓реА рдЬрд╛рдд рд╣реЛрддреА gather() ╨╕ spread(). рдпрд╛ рдлрдВрдХреНрд╢рдиреНрд╕рдЪреНрдпрд╛ рдЕрд╕реНрддрд┐рддреНрд╡рд╛рдЪреНрдпрд╛ рд╡рд░реНрд╖рд╛рдиреБрд╡рд░реНрд╖реЗ, рд╣реЗ рд╕реНрдкрд╖реНрдЯ рдЭрд╛рд▓реЗ рдЖрд╣реЗ рдХреА рдкреЕрдХреЗрдЬрдЪреНрдпрд╛ рд▓реЗрдЦрдХрд╛рд╕рд╣ рдмрд╣реБрддреЗрдХ рд╡рд╛рдкрд░рдХрд░реНрддреНрдпрд╛рдВрд╕рд╛рдареА, рдпрд╛ рдлрдВрдХреНрд╢рдиреНрд╕рдЪреА рдирд╛рд╡реЗ рдЖрдгрд┐ рддреНрдпрд╛рдВрдЪреЗ рдпреБрдХреНрддрд┐рд╡рд╛рдж рдкреВрд░реНрдгрдкрдгреЗ рд╕реНрдкрд╖реНрдЯ рдирд╡реНрд╣рддреЗ рдЖрдгрд┐ рддреНрдпрд╛рдВрдирд╛ рд╢реЛрдзрдгреНрдпрд╛рдд рдЖрдгрд┐ рдпрд╛рдкреИрдХреА рдХреЛрдгрддреЗ рдХрд╛рд░реНрдп рд░реВрдкрд╛рдВрддрд░рд┐рдд рд╣реЛрддреЗ рд╣реЗ рд╕рдордЬрдгреНрдпрд╛рдд рдЕрдбрдЪрдгреА рдирд┐рд░реНрдорд╛рдг рдЭрд╛рд▓реНрдпрд╛. рд░реБрдВрдж рддреЗ рд▓рд╛рдВрдм рд╕реНрд╡рд░реВрдкрд╛рдЪреА рддрд╛рд░реАрдЦ рдлреНрд░реЗрдо рдЖрдгрд┐ рддреНрдпрд╛рдЙрд▓рдЯ.

рдпрд╛ рд╕рдВрджрд░реНрднрд╛рдд, рдордзреНрдпреЗ рд╡реНрдпрд╡рд╕реНрдерд┐рдд рджреЛрди рдирд╡реАрди, рдорд╣рддреНрд╡рд╛рдЪреА рдХрд╛рд░реНрдпреЗ рдЬреЛрдбрд▓реА рдЧреЗрд▓реА рдЖрд╣реЗрдд рдЬреА рддрд╛рд░реАрдЦ рдлреНрд░реЗрдореНрд╕рдЪреЗ рд░реВрдкрд╛рдВрддрд░ рдХрд░рдгреНрдпрд╛рд╕рд╛рдареА рдбрд┐рдЭрд╛рдЗрди рдХреЗрд▓реЗрд▓реА рдЖрд╣реЗрдд.

рдирд╡реАрди рд╡реИрд╢рд┐рд╖реНрдЯреНрдпреЗ pivot_longer() ╨╕ pivot_wider() рдкреЕрдХреЗрдЬрдордзреАрд▓ рдХрд╛рд╣реА рд╡реИрд╢рд┐рд╖реНрдЯреНрдпрд╛рдВрджреНрд╡рд╛рд░реЗ рдкреНрд░реЗрд░рд┐рдд рд╣реЛрддреЗ cdata, рдЬреЙрди рдорд╛рдЙрдВрдЯ рдЖрдгрд┐ рдиреАрдирд╛ рдЭреБрдореЗрд▓ рдпрд╛рдВрдиреА рддрдпрд╛рд░ рдХреЗрд▓реЗ.

tidyr 0.8.3.9000 рдЪреА рд╕рд░реНрд╡рд╛рдд рд╡рд░реНрддрдорд╛рди рдЖрд╡реГрддреНрддреА рд╕реНрдерд╛рдкрд┐рдд рдХрд░рдд рдЖрд╣реЗ

рдкреЕрдХреЗрдЬрдЪреА рдирд╡реАрди, рд╕рд░реНрд╡рд╛рдд рд╡рд░реНрддрдорд╛рди рдЖрд╡реГрддреНрддреА рд╕реНрдерд╛рдкрд┐рдд рдХрд░рдгреНрдпрд╛рд╕рд╛рдареА рд╡реНрдпрд╡рд╕реНрдерд┐рдд 0.8.3.9000, рдЬреЗрдереЗ рдирд╡реАрди рд╡реИрд╢рд┐рд╖реНрдЯреНрдпреЗ рдЙрдкрд▓рдмреНрдз рдЖрд╣реЗрдд, рдЦрд╛рд▓реАрд▓ рдХреЛрдб рд╡рд╛рдкрд░рд╛.

devtools::install_github("tidyverse/tidyr")

рд▓реЗрдЦрдирд╛рдЪреНрдпрд╛ рд╡реЗрд│реА, рд╣реА рдХрд╛рд░реНрдпреЗ рдХреЗрд╡рд│ GitHub рд╡рд░реАрд▓ рдкреЕрдХреЗрдЬрдЪреНрдпрд╛ рдбреЗрд╡реНрд╣ рдЖрд╡реГрддреНрддреАрдордзреНрдпреЗ рдЙрдкрд▓рдмреНрдз рдЖрд╣реЗрдд.

рдирд╡реАрди рд╡реИрд╢рд┐рд╖реНрдЯреНрдпрд╛рдВрдордзреНрдпреЗ рд╕рдВрдХреНрд░рдордг

рдЦрд░рдВ рддрд░, рдирд╡реАрди рдлрдВрдХреНрд╢рдиреНрд╕рд╕рд╣ рдХрд╛рд░реНрдп рдХрд░рдгреНрдпрд╛рд╕рд╛рдареА рдЬреБрдиреНрдпрд╛ рд╕реНрдХреНрд░рд┐рдкреНрдЯреНрд╕ рд╣рд╕реНрддрд╛рдВрддрд░рд┐рдд рдХрд░рдгреЗ рдХрдареАрдг рдирд╛рд╣реА, рдореА рдЬреБрдиреНрдпрд╛ рдлрдВрдХреНрд╢рдиреНрд╕рдЪреНрдпрд╛ рджрд╕реНрддрдРрд╡рдЬреАрдХрд░рдгрд╛рддреВрди рдПрдХ рдЙрджрд╛рд╣рд░рдг рдШреЗрдИрди рдЖрдгрд┐ рдирд╡реАрди рдлрдВрдХреНрд╢рдиреНрд╕рдЪрд╛ рд╡рд╛рдкрд░ рдХрд░реВрди рддреАрдЪ рдСрдкрд░реЗрд╢рдиреНрд╕ рдХрд╢реА рдХреЗрд▓реА рдЬрд╛рддрд╛рдд рд╣реЗ рджрд░реНрд╢рд╡реЗрд▓; pivot_*() рдХрд╛рд░реНрдпреЗ

рд╡рд╛рдЗрдб рдлреЙрд░рдореЕрдЯ рд▓рд╛рдБрдЧ рдлреЙрд░рдореЕрдЯрдордзреНрдпреЗ рд░реВрдкрд╛рдВрддрд░рд┐рдд рдХрд░рд╛.

рдЧреЕрджрд░ рдлрдВрдХреНрд╢рди рдбреЙрдХреНрдпреБрдореЗрдВрдЯреЗрд╢рдирдордзреАрд▓ рдЙрджрд╛рд╣рд░рдг рдХреЛрдб

# example
library(dplyr)
stocks <- data.frame(
  time = as.Date('2009-01-01') + 0:9,
  X = rnorm(10, 0, 1),
  Y = rnorm(10, 0, 2),
  Z = rnorm(10, 0, 4)
)

# old
stocks_gather <- stocks %>% gather(key   = stock, 
                                   value = price, 
                                   -time)

# new
stocks_long   <- stocks %>% pivot_longer(cols      = -time, 
                                       names_to  = "stock", 
                                       values_to = "price")

рд▓рд╛рдВрдм рдлреЙрд░рдореЕрдЯрд▓рд╛ рд░реБрдВрдж рдлреЙрд░рдореЕрдЯрдордзреНрдпреЗ рд░реВрдкрд╛рдВрддрд░рд┐рдд рдХрд░рдд рдЖрд╣реЗ.

рд╕реНрдкреНрд░реЗрдб рдлрдВрдХреНрд╢рди рдбреЙрдХреНрдпреБрдореЗрдВрдЯреЗрд╢рдирдордзреАрд▓ рдЙрджрд╛рд╣рд░рдг рдХреЛрдб

# old
stocks_spread <- stocks_gather %>% spread(key = stock, 
                                          value = price) 

# new 
stock_wide    <- stocks_long %>% pivot_wider(names_from  = "stock",
                                            values_from = "price")

рдХрд╛рд░рдг рд╕рд╣ рдХрд╛рдо рдХрд░рдгреНрдпрд╛рдЪреНрдпрд╛ рд╡рд░реАрд▓ рдЙрджрд╛рд╣рд░рдгрд╛рдВрдордзреНрдпреЗ pivot_longer() ╨╕ pivot_wider(), рдореВрд│ рд╕рд╛рд░рдгреАрдордзреНрдпреЗ рд╕рд╛рдард╛ рд╡рд┐рддрд░реНрдХрд╛рдВрдордзреНрдпреЗ рдХреЛрдгрддреЗрд╣реА рд╕реНрддрдВрдн рд╕реВрдЪреАрдмрджреНрдз рдирд╛рд╣реАрдд рдирд╛рд╡реЗ_рд▓рд╛ ╨╕ values_to рддреНрдпрд╛рдВрдЪреА рдирд╛рд╡реЗ рдЕрд╡рддрд░рдг рдЪрд┐рдиреНрд╣рд╛рдВрдордзреНрдпреЗ рдЕрд╕рдгреЗ рдЖрд╡рд╢реНрдпрдХ рдЖрд╣реЗ.

рдПрдХ рд╕рд╛рд░рдгреА рдЬреА рддреБрдореНрд╣рд╛рд▓рд╛ рдирд╡реАрди рд╕рдВрдХрд▓реНрдкрдиреЗрд╕рд╣ рдХрд╛рд░реНрдп рдХрд░рдгреНрдпрд╛рд╕рд╛рдареА рдХрд╕реЗ рд╕реНрд╡рд┐рдЪ рдХрд░рд╛рд╡реЗ рд╣реЗ рд╕рд╣рдЬрдкрдгреЗ рд╢реЛрдзрдгреНрдпрд╛рдд рдорджрдд рдХрд░реЗрд▓ рд╡реНрдпрд╡рд╕реНрдерд┐рдд.

рдЖрд░ рдкреЕрдХреЗрдЬ tidyr рдЖрдгрд┐ рддреНрдпрд╛рдЪреА рдирд╡реАрди рдХрд╛рд░реНрдпреЗ pivot_longer рдЖрдгрд┐ pivot_wider

рд▓реЗрдЦрдХрд╛рдХрдбреВрди рдЯреАрдк

рдЦрд╛рд▓реАрд▓ рд╕рд░реНрд╡ рдордЬрдХреВрд░ рдЕрдиреБрдХреВрд▓реА рдЖрд╣реЗ, рдореА рд╡рд┐рдирд╛рдореВрд▓реНрдп рднрд╛рд╖рд╛рдВрддрд░ рджреЗрдЦреАрд▓ рдореНрд╣рдгреЗрди рд╡рд┐рдЧреНрдиреЗрдЯреНрд╕ рдЕрдзрд┐рдХреГрдд tidyverse рд▓рд╛рдпрдмреНрд░рд░реА рд╡реЗрдмрд╕рд╛рдЗрдЯрд╡рд░реВрди.

рдбреЗрдЯрд╛ рд░реБрдВрдж рддреЗ рд▓рд╛рдВрдм рдлреЙрд░рдореЕрдЯрдордзреНрдпреЗ рд░реВрдкрд╛рдВрддрд░рд┐рдд рдХрд░рдгреНрдпрд╛рдЪреЗ рдПрдХ рд╕рд╛рдзреЗ рдЙрджрд╛рд╣рд░рдг

pivot_longer () тАФ рд╕реНрддрдВрднрд╛рдВрдЪреА рд╕рдВрдЦреНрдпрд╛ рдХрдореА рдХрд░реВрди рдЖрдгрд┐ рдкрдВрдХреНрддреАрдВрдЪреА рд╕рдВрдЦреНрдпрд╛ рд╡рд╛рдврд╡реВрди рдбреЗрдЯрд╛ рд╕рдВрдЪ рд▓рд╛рдВрдм рдмрдирд╡рддреЗ.

рдЖрд░ рдкреЕрдХреЗрдЬ tidyr рдЖрдгрд┐ рддреНрдпрд╛рдЪреА рдирд╡реАрди рдХрд╛рд░реНрдпреЗ pivot_longer рдЖрдгрд┐ pivot_wider

рд▓реЗрдЦрд╛рдд рд╕рд╛рджрд░ рдХреЗрд▓реЗрд▓реА рдЙрджрд╛рд╣рд░рдгреЗ рдЪрд╛рд▓рд╡рд┐рдгреНрдпрд╛рд╕рд╛рдареА, рдЖрдкрд▓реНрдпрд╛рд▓рд╛ рдкреНрд░рдердо рдЖрд╡рд╢реНрдпрдХ рдкреЕрдХреЗрдЬреЗрд╕ рдХрдиреЗрдХреНрдЯ рдХрд░рдгреНрдпрд╛рдЪреА рдЖрд╡рд╢реНрдпрдХрддрд╛ рдЖрд╣реЗ:

library(tidyr)
library(dplyr)
library(readr)

рд╕рдордЬрд╛ рдЖрдордЪреНрдпрд╛рдХрдбреЗ рд╕рд░реНрд╡реЗрдХреНрд╖рдгрд╛рдЪреНрдпрд╛ рдирд┐рдХрд╛рд▓рд╛рдВрд╕рд╣ рдПрдХ рдЯреЗрдмрд▓ рдЖрд╣реЗ рдЬреНрдпрд╛рдиреЗ (рдЗрддрд░ рдЧреЛрд╖реНрдЯреАрдВрдмрд░реЛрдмрд░рдЪ) рд▓реЛрдХрд╛рдВрдирд╛ рддреНрдпрд╛рдВрдЪрд╛ рдзрд░реНрдо рдЖрдгрд┐ рд╡рд╛рд░реНрд╖рд┐рдХ рдЙрддреНрдкрдиреНрди рдпрд╛рдмрджреНрджрд▓ рд╡рд┐рдЪрд╛рд░рд▓реЗ:

#> # A tibble: 18 x 11
#>    religion `<$10k` `$10-20k` `$20-30k` `$30-40k` `$40-50k` `$50-75k`
#>    <chr>      <dbl>     <dbl>     <dbl>     <dbl>     <dbl>     <dbl>
#>  1 Agnostic      27        34        60        81        76       137
#>  2 Atheist       12        27        37        52        35        70
#>  3 Buddhist      27        21        30        34        33        58
#>  4 Catholic     418       617       732       670       638      1116
#>  5 DonтАЩt kтАж      15        14        15        11        10        35
#>  6 EvangelтАж     575       869      1064       982       881      1486
#>  7 Hindu          1         9         7         9        11        34
#>  8 HistoriтАж     228       244       236       238       197       223
#>  9 JehovahтАж      20        27        24        24        21        30
#> 10 Jewish        19        19        25        25        30        95
#> # тАж with 8 more rows, and 4 more variables: `$75-100k` <dbl>,
#> #   `$100-150k` <dbl>, `>150k` <dbl>, `Don't know/refused` <dbl>

рдпрд╛ рд╕рд╛рд░рдгреАрдордзреНрдпреЗ рдЙрддреНрддрд░рджрд╛рддреНрдпрд╛рдВрдЪрд╛ рдзрд░реНрдо рдбреЗрдЯрд╛ рдкрдВрдХреНрддреАрдВрдордзреНрдпреЗ рдЖрд╣реЗ рдЖрдгрд┐ рдЙрддреНрдкрдиреНрдирд╛рдЪреА рдкрд╛рддрд│реА рд╕реНрддрдВрдн рдирд╛рд╡рд╛рдВрдордзреНрдпреЗ рд╡рд┐рдЦреБрд░рд▓реЗрд▓реА рдЖрд╣реЗ. рдкреНрд░рддреНрдпреЗрдХ рд╢реНрд░реЗрдгреАрддреАрд▓ рдкреНрд░рддрд┐рд╕рд╛рджрдХрд░реНрддреНрдпрд╛рдВрдЪреА рд╕рдВрдЦреНрдпрд╛ рд╕реЗрд▓ рдореВрд▓реНрдпрд╛рдВрдордзреНрдпреЗ рдзрд░реНрдо рдЖрдгрд┐ рдЙрддреНрдкрдиреНрди рд╕реНрддрд░рд╛рдЪреНрдпрд╛ рдЫреЗрджрдирдмрд┐рдВрджреВрд╡рд░ рд╕рдВрдЧреНрд░рд╣рд┐рдд рдХреЗрд▓реА рдЬрд╛рддреЗ. рдЯреЗрдмрд▓ рд╡реНрдпрд╡рд╕реНрдерд┐рдд, рдпреЛрдЧреНрдп рд╕реНрд╡рд░реВрдкрд╛рдд рдЖрдгрдгреНрдпрд╛рд╕рд╛рдареА, рддреЗ рд╡рд╛рдкрд░рдгреНрдпрд╛рд╕рд╛рдареА рдкреБрд░реЗрд╕реЗ рдЖрд╣реЗ pivot_longer():

pew %>% 
  pivot_longer(cols = -religion, names_to = "income", values_to = "count")

pew %>% 
  pivot_longer(cols = -religion, names_to = "income", values_to = "count")
#> # A tibble: 180 x 3
#>    religion income             count
#>    <chr>    <chr>              <dbl>
#>  1 Agnostic <$10k                 27
#>  2 Agnostic $10-20k               34
#>  3 Agnostic $20-30k               60
#>  4 Agnostic $30-40k               81
#>  5 Agnostic $40-50k               76
#>  6 Agnostic $50-75k              137
#>  7 Agnostic $75-100k             122
#>  8 Agnostic $100-150k            109
#>  9 Agnostic >150k                 84
#> 10 Agnostic Don't know/refused    96
#> # тАж with 170 more rows

рдХрд╛рд░реНрдп рд╡рд┐рддрд░реНрдХ pivot_longer()

  • рдкрд╣рд┐рд▓рд╛ рдпреБрдХреНрддрд┐рд╡рд╛рдж рдХреЙрд▓рд░, рдХреЛрдгрддреЗ рд╕реНрддрдВрдн рд╡рд┐рд▓реАрди рдХрд░рдгреЗ рдЖрд╡рд╢реНрдпрдХ рдЖрд╣реЗ рдпрд╛рдЪреЗ рд╡рд░реНрдгрди рдХрд░рддреЗ. рдпрд╛ рдкреНрд░рдХрд░рдгрд╛рдд, рд╡рдЧрд│рддрд╛ рд╕рд░реНрд╡ рд╕реНрддрдВрдн рд╡реЗрд│.
  • рдпреБрдХреНрддрд┐рд╡рд╛рдж рдирд╛рд╡реЗ_рд▓рд╛ рд╡реНрд╣реЗрд░рд┐рдПрдмрд▓рдЪреЗ рдирд╛рд╡ рджреЗрддреЗ рдЬреЗ рдЖрдореНрд╣реА рдПрдХрддреНрд░рд┐рдд рдХреЗрд▓реЗрд▓реНрдпрд╛ рд╕реНрддрдВрднрд╛рдВрдЪреНрдпрд╛ рдирд╛рд╡рд╛рдВрд╡рд░реВрди рддрдпрд╛рд░ рдХреЗрд▓реЗ рдЬрд╛рдИрд▓.
  • values_to рдПрдХрд╛ рд╡реНрд╣реЗрд░рд┐рдПрдмрд▓рдЪреЗ рдирд╛рд╡ рджреЗрддреЗ рдЬреЗ рд╡рд┐рд▓реАрди рдХреЗрд▓реЗрд▓реНрдпрд╛ рд╕реНрддрдВрднрд╛рдВрдЪреНрдпрд╛ рд╕реЗрд▓рдЪреНрдпрд╛ рдореВрд▓реНрдпрд╛рдВрдордзреНрдпреЗ рд╕рдВрдЧреНрд░рд╣рд┐рдд рдбреЗрдЯрд╛рдордзреВрди рддрдпрд╛рд░ рдХреЗрд▓реЗ рдЬрд╛рдИрд▓.

рддрдкрд╢реАрд▓

рд╣реА рдкреЕрдХреЗрдЬрдЪреА рдирд╡реАрди рдХрд╛рд░реНрдпрдХреНрд╖рдорддрд╛ рдЖрд╣реЗ рд╡реНрдпрд╡рд╕реНрдерд┐рдд, рдЬреЗ рд▓реАрдЧреЗрд╕реА рдлрдВрдХреНрд╢рдиреНрд╕рд╕рд╣ рдХрд╛рд░реНрдп рдХрд░рддрд╛рдирд╛ рдкреВрд░реНрд╡реА рдЕрдиреБрдкрд▓рдмреНрдз рд╣реЛрддреЗ.

рд╕реНрдкреЗрд╕рд┐рдлрд┐рдХреЗрд╢рди рдореНрд╣рдгрдЬреЗ рдбреЗрдЯрд╛ рдлреНрд░реЗрдо, рдЬреНрдпрд╛рдЪреА рдкреНрд░рддреНрдпреЗрдХ рдкрдВрдХреНрддреА рдирд╡реАрди рдЖрдЙрдЯрдкреБрдЯ рдбреЗрдЯ рдлреНрд░реЗрдордордзреАрд▓ рдПрдХрд╛ рдХреЙрд▓рдорд╢реА рд╕рдВрдмрдВрдзрд┐рдд рдЕрд╕рддреЗ рдЖрдгрд┐ рджреЛрди рд╡рд┐рд╢реЗрд╖ рдХреЙрд▓рдо рдЬреНрдпрд╛рдкрд╛рд╕реВрди рд╕реБрд░реВ рд╣реЛрддрд╛рдд:

  • .рдХреГрдкрдпрд╛ рдореВрд│ рд╕реНрддрдВрднрд╛рдЪреЗ рдирд╛рд╡ рд╕рдорд╛рд╡рд┐рд╖реНрдЯ рдЖрд╣реЗ.
  • .рдореВрд▓реНрдп рд╕реНрддрдВрднрд╛рдЪреЗ рдирд╛рд╡ рдЖрд╣реЗ рдЬреНрдпрд╛рдордзреНрдпреЗ рд╕реЗрд▓ рдореВрд▓реНрдпреЗ рдЕрд╕рддреАрд▓.

рд╕реНрдкреЗрд╕рд┐рдлрд┐рдХреЗрд╢рдирдЪреЗ рдЙрд░рд▓реЗрд▓реЗ рдХреЙрд▓рдо рд╣реЗ рдкреНрд░рддрд┐рдмрд┐рдВрдмрд┐рдд рдХрд░рддрд╛рдд рдХреА рдирд╡реАрди рдХреЙрд▓рдо рд╕рдВрдХреБрдЪрд┐рдд рдХреЙрд▓рдордЪреЗ рдирд╛рд╡ рдХрд╕реЗ рдкреНрд░рджрд░реНрд╢рд┐рдд рдХрд░реЗрд▓ .рдХреГрдкрдпрд╛.

рд╕реНрдкреЗрд╕рд┐рдлрд┐рдХреЗрд╢рди рдХреЙрд▓рдордЪреНрдпрд╛ рдирд╛рд╡рд╛рдд рд╕рд╛рдард╡рд▓реЗрд▓реНрдпрд╛ рдореЗрдЯрд╛рдбреЗрдЯрд╛рдЪреЗ рд╡рд░реНрдгрди рдХрд░рддреЗ, рдкреНрд░рддреНрдпреЗрдХ рдХреЙрд▓рдорд╕рд╛рдареА рдПрдХ рдкрдВрдХреНрддреА рдЖрдгрд┐ рдкреНрд░рддреНрдпреЗрдХ рд╡реНрд╣реЗрд░рд┐рдПрдмрд▓рд╕рд╛рдареА рдПрдХ рдХреЙрд▓рдо, рдХреЙрд▓рдордЪреНрдпрд╛ рдирд╛рд╡рд╛рд╕рд╣ рдПрдХрддреНрд░рд┐рдд, рд╣реА рд╡реНрдпрд╛рдЦреНрдпрд╛ рдпрд╛ рдХреНрд╖рдгреА рдЧреЛрдВрдзрд│рд╛рдд рдЯрд╛рдХрдгрд╛рд░реА рд╡рд╛рдЯреВ рд╢рдХрддреЗ, рдкрд░рдВрддреБ рдХрд╛рд╣реА рдЙрджрд╛рд╣рд░рдгреЗ рдкрд╛рд╣рд┐рд▓реНрдпрд╛рдирдВрддрд░ рддреЗ рдмрд░реЗрдЪ рд╣реЛрдИрд▓. рдЕрдзрд┐рдХ рд╕реНрдкрд╖реНрдЯ

рд╕реНрдкреЗрд╕рд┐рдлрд┐рдХреЗрд╢рдирдЪрд╛ рдореБрджреНрджрд╛ рдЕрд╕рд╛ рдЖрд╣реЗ рдХреА рд░реВрдкрд╛рдВрддрд░рд┐рдд рдХреЗрд▓реНрдпрд╛ рдЬрд╛рдд рдЕрд╕рд▓реЗрд▓реНрдпрд╛ рдбреЗрдЯрд╛рдлреНрд░реЗрдорд╕рд╛рдареА рддреБрдореНрд╣реА рдирд╡реАрди рдореЗрдЯрд╛рдбреЗрдЯрд╛ рдкреБрдирд░реНрдкреНрд░рд╛рдкреНрдд, рд╕реБрдзрд╛рд░рд┐рдд рдЖрдгрд┐ рдкрд░рд┐рднрд╛рд╖рд┐рдд рдХрд░реВ рд╢рдХрддрд╛.

рд╕рд╛рд░рдгреАрд▓рд╛ рд░реБрдВрдж рдлреЙрд░рдореЕрдЯрдордзреВрди рд▓рд╛рдВрдм рдлреЙрд░рдореЕрдЯрдордзреНрдпреЗ рд░реВрдкрд╛рдВрддрд░рд┐рдд рдХрд░рддрд╛рдирд╛ рд╡реИрд╢рд┐рд╖реНрдЯреНрдпрд╛рдВрд╕рд╣ рдХрд╛рд░реНрдп рдХрд░рдгреНрдпрд╛рд╕рд╛рдареА, рдлрдВрдХреНрд╢рди рд╡рд╛рдкрд░рд╛ pivot_longer_spec().

рд╣реЗ рдХрд╛рд░реНрдп рдХрд╕реЗ рдХрд╛рд░реНрдп рдХрд░рддреЗ рддреЗ рдЕрд╕реЗ рдЖрд╣реЗ рдХреА рддреЗ рдХреЛрдгрддреАрд╣реА рддрд╛рд░реАрдЦ рдлреНрд░реЗрдо рдШреЗрддреЗ рдЖрдгрд┐ рд╡рд░ рд╡рд░реНрдгрди рдХреЗрд▓реЗрд▓реНрдпрд╛ рдкрджреНрдзрддреАрдиреЗ рддреНрдпрд╛рдЪрд╛ рдореЗрдЯрд╛рдбреЗрдЯрд╛ рддрдпрд╛рд░ рдХрд░рддреЗ.

рдЙрджрд╛рд╣рд░рдг рдореНрд╣рдгреВрди, рдкреЕрдХреЗрдЬрд╕рд╣ рдкреНрд░рджрд╛рди рдХреЗрд▓реЗрд▓рд╛ рдбреЗрдЯрд╛рд╕реЗрдЯ рдХреЛрдгрд╛рдЪрд╛ рдЖрд╣реЗ рддреЗ рдШреЗрдК рд╡реНрдпрд╡рд╕реНрдерд┐рдд. рдпрд╛ рдбреЗрдЯрд╛рд╕реЗрдЯрдордзреНрдпреЗ рдХреНрд╖рдпрд░реЛрдЧрд╛рдЪреНрдпрд╛ рдШрдЯрдирд╛рдВрдмрджреНрджрд▓ рдЖрдВрддрд░рд░рд╛рд╖реНрдЯреНрд░реАрдп рдЖрд░реЛрдЧреНрдп рд╕рдВрдШрдЯрдиреЗрдиреЗ рдкреНрд░рджрд╛рди рдХреЗрд▓реЗрд▓реА рдорд╛рд╣рд┐рддреА рдЖрд╣реЗ.

who
#> # A tibble: 7,240 x 60
#>    country iso2  iso3   year new_sp_m014 new_sp_m1524 new_sp_m2534
#>    <chr>   <chr> <chr> <int>       <int>        <int>        <int>
#>  1 AfghanтАж AF    AFG    1980          NA           NA           NA
#>  2 AfghanтАж AF    AFG    1981          NA           NA           NA
#>  3 AfghanтАж AF    AFG    1982          NA           NA           NA
#>  4 AfghanтАж AF    AFG    1983          NA           NA           NA
#>  5 AfghanтАж AF    AFG    1984          NA           NA           NA
#>  6 AfghanтАж AF    AFG    1985          NA           NA           NA
#>  7 AfghanтАж AF    AFG    1986          NA           NA           NA
#>  8 AfghanтАж AF    AFG    1987          NA           NA           NA
#>  9 AfghanтАж AF    AFG    1988          NA           NA           NA
#> 10 AfghanтАж AF    AFG    1989          NA           NA           NA
#> # тАж with 7,230 more rows, and 53 more variables

рдЪрд▓рд╛ рддреНрдпрд╛рдЪреЗ рддрдкрд╢реАрд▓ рддрдпрд╛рд░ рдХрд░реВрдпрд╛.

spec <- who %>%
  pivot_longer_spec(new_sp_m014:newrel_f65, values_to = "count")

#> # A tibble: 56 x 3
#>    .name        .value name        
#>    <chr>        <chr>  <chr>       
#>  1 new_sp_m014  count  new_sp_m014 
#>  2 new_sp_m1524 count  new_sp_m1524
#>  3 new_sp_m2534 count  new_sp_m2534
#>  4 new_sp_m3544 count  new_sp_m3544
#>  5 new_sp_m4554 count  new_sp_m4554
#>  6 new_sp_m5564 count  new_sp_m5564
#>  7 new_sp_m65   count  new_sp_m65  
#>  8 new_sp_f014  count  new_sp_f014 
#>  9 new_sp_f1524 count  new_sp_f1524
#> 10 new_sp_f2534 count  new_sp_f2534
#> # тАж with 46 more rows

рдлреАрд▓реНрдб рджреЗрд╢рд╛рддреАрд▓, isoxnumx, isoxnumx рдЖрдзреАрдЪ рд╡реНрд╣реЗрд░рд┐рдПрдмрд▓реНрд╕ рдЖрд╣реЗрдд. рдЖрдордЪреЗ рдХрд╛рд░реНрдп рд╕реНрддрдВрдн рдлреНрд▓рд┐рдк рдХрд░рдгреЗ рдЖрд╣реЗ new_sp_m014 рд╡рд░ newrel_f65.

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

  • рдЙрдкрд╕рд░реНрдЧ new_ рд╣реЗ рд╕реВрдЪрд┐рдд рдХрд░рддреЗ рдХреА рд╕реНрддрдВрднрд╛рдд рдХреНрд╖рдпрд░реЛрдЧрд╛рдЪреНрдпрд╛ рдирд╡реАрди рдкреНрд░рдХрд░рдгрд╛рдВрдЪрд╛ рдбреЗрдЯрд╛ рдЖрд╣реЗ, рд╡рд░реНрддрдорд╛рди рддрд╛рд░рдЦреЗрдЪреНрдпрд╛ рдлреНрд░реЗрдордордзреНрдпреЗ рдлрдХреНрдд рдирд╡реАрди рд░реЛрдЧрд╛рдВрдмрджреНрджрд▓ рдорд╛рд╣рд┐рддреА рдЖрд╣реЗ, рддреНрдпрд╛рдореБрд│реЗ рд╕рдзреНрдпрд╛рдЪреНрдпрд╛ рд╕рдВрджрд░реНрднрд╛рдд рдпрд╛ рдЙрдкрд╕рд░реНрдЧрд╛рдЪрд╛ рдХрд╛рд╣реА рдЕрд░реНрде рдирд╛рд╣реА.
  • sp/rel/sp/ep рд░реЛрдЧрд╛рдЪреЗ рдирд┐рджрд╛рди рдХрд░рдгреНрдпрд╛рдЪреНрдпрд╛ рдкрджреНрдзрддреАрдЪреЗ рд╡рд░реНрдгрди рдХрд░рддреЗ.
  • m/f рд░реБрдЧреНрдгрд╛рдЪреЗ рд▓рд┐рдВрдЧ.
  • 014/1524/2535/3544/4554/65 рд░реБрдЧреНрдгрд╛рдЪреА рд╡рдп рд╢реНрд░реЗрдгреА.

рдлрдВрдХреНрд╢рди рд╡рд╛рдкрд░реВрди рдЖрдкрдг рд╣реЗ рдХреЙрд▓рдо рд╡рд┐рднрд╛рдЬрд┐рдд рдХрд░реВ рд╢рдХрддреЛ extract()рдирд┐рдпрдорд┐рдд рдЕрднрд┐рд╡реНрдпрдХреНрддреА рд╡рд╛рдкрд░рдгреЗ.

spec <- spec %>%
        extract(name, c("diagnosis", "gender", "age"), "new_?(.*)_(.)(.*)")

#> # A tibble: 56 x 5
#>    .name        .value diagnosis gender age  
#>    <chr>        <chr>  <chr>     <chr>  <chr>
#>  1 new_sp_m014  count  sp        m      014  
#>  2 new_sp_m1524 count  sp        m      1524 
#>  3 new_sp_m2534 count  sp        m      2534 
#>  4 new_sp_m3544 count  sp        m      3544 
#>  5 new_sp_m4554 count  sp        m      4554 
#>  6 new_sp_m5564 count  sp        m      5564 
#>  7 new_sp_m65   count  sp        m      65   
#>  8 new_sp_f014  count  sp        f      014  
#>  9 new_sp_f1524 count  sp        f      1524 
#> 10 new_sp_f2534 count  sp        f      2534 
#> # тАж with 46 more rows

рдХреГрдкрдпрд╛ рд╕реНрддрдВрдн рд▓рдХреНрд╖рд╛рдд рдШреНрдпрд╛ .рдХреГрдкрдпрд╛ рдореВрд│ рдбреЗрдЯрд╛рд╕реЗрдЯрдЪреНрдпрд╛ рд╕реНрддрдВрдн рдирд╛рд╡рд╛рдВрдордзреНрдпреЗ рд╣реА рдЖрдордЪреА рдЕрдиреБрдХреНрд░рдордгрд┐рдХрд╛ рдЕрд╕рд▓реНрдпрд╛рдореБрд│реЗ рддреА рдЕрдкрд░рд┐рд╡рд░реНрддрд┐рдд рд░рд╛рд╣рд┐рд▓реА рдкрд╛рд╣рд┐рдЬреЗ.

рд▓рд┐рдВрдЧ рдЖрдгрд┐ рд╡рдп (рд╕реНрддрдВрдн рд▓рд┐рдВрдЧ ╨╕ рд╡рдп) рдордзреНрдпреЗ рдирд┐рд╢реНрдЪрд┐рдд рдЖрдгрд┐ рдЬреНрдЮрд╛рдд рдореВрд▓реНрдпреЗ рдЖрд╣реЗрдд, рдореНрд╣рдгреВрди рд╣реЗ рд╕реНрддрдВрдн рдШрдЯрдХрд╛рдВрдордзреНрдпреЗ рд░реВрдкрд╛рдВрддрд░рд┐рдд рдХрд░рдгреНрдпрд╛рдЪреА рд╢рд┐рдлрд╛рд░рд╕ рдХреЗрд▓реА рдЬрд╛рддреЗ:

spec <-  spec %>%
            mutate(
              gender = factor(gender, levels = c("f", "m")),
              age = factor(age, levels = unique(age), ordered = TRUE)
            ) 

рд╢реЗрд╡рдЯреА, рдЖрдореНрд╣реА рдореВрд│ рддрд╛рд░реАрдЦ рдлреНрд░реЗрдорд╡рд░ рддрдпрд╛рд░ рдХреЗрд▓реЗрд▓реЗ рддрдкрд╢реАрд▓ рд▓рд╛рдЧреВ рдХрд░рдгреНрдпрд╛рд╕рд╛рдареА рдХреЛрдг рдЖрдореНрд╣рд╛рд▓рд╛ рдпреБрдХреНрддрд┐рд╡рд╛рдж рд╡рд╛рдкрд░рдгреНрдпрд╛рдЪреА рдЖрд╡рд╢реНрдпрдХрддрд╛ рдЖрд╣реЗ рдЪрд╖реНрдорд╛ рдХрд╛рд░реНрдпрд╛рдд pivot_longer().

who %>% pivot_longer(spec = spec)

#> # A tibble: 405,440 x 8
#>    country     iso2  iso3   year diagnosis gender age   count
#>    <chr>       <chr> <chr> <int> <chr>     <fct>  <ord> <int>
#>  1 Afghanistan AF    AFG    1980 sp        m      014      NA
#>  2 Afghanistan AF    AFG    1980 sp        m      1524     NA
#>  3 Afghanistan AF    AFG    1980 sp        m      2534     NA
#>  4 Afghanistan AF    AFG    1980 sp        m      3544     NA
#>  5 Afghanistan AF    AFG    1980 sp        m      4554     NA
#>  6 Afghanistan AF    AFG    1980 sp        m      5564     NA
#>  7 Afghanistan AF    AFG    1980 sp        m      65       NA
#>  8 Afghanistan AF    AFG    1980 sp        f      014      NA
#>  9 Afghanistan AF    AFG    1980 sp        f      1524     NA
#> 10 Afghanistan AF    AFG    1980 sp        f      2534     NA
#> # тАж with 405,430 more rows

рдЖрдореНрд╣реА рдЬреЗ рдХрд╛рд╣реА рдХреЗрд▓реЗ рддреЗ рдЦрд╛рд▓реАрд▓рдкреНрд░рдорд╛рдгреЗ рдпреЛрдЬрдирд╛рдмрджреНрдзрдкрдгреЗ рдЪрд┐рддреНрд░рд┐рдд рдХреЗрд▓реЗ рдЬрд╛рдК рд╢рдХрддреЗ:

рдЖрд░ рдкреЕрдХреЗрдЬ tidyr рдЖрдгрд┐ рддреНрдпрд╛рдЪреА рдирд╡реАрди рдХрд╛рд░реНрдпреЗ pivot_longer рдЖрдгрд┐ pivot_wider

рдПрдХрд╛рдзрд┐рдХ рдореВрд▓реНрдпреЗ рд╡рд╛рдкрд░реВрди рддрдкрд╢реАрд▓ (.value)

рд╡рд░реАрд▓ рдЙрджрд╛рд╣рд░рдгрд╛рдордзреНрдпреЗ, рддрдкрд╢реАрд▓ рд╕реНрддрдВрдн .рдореВрд▓реНрдп рдлрдХреНрдд рдПрдХ рдореВрд▓реНрдп рд╕рдорд╛рд╡рд┐рд╖реНрдЯ рдЖрд╣реЗ, рдмрд╣реБрддреЗрдХ рдкреНрд░рдХрд░рдгрд╛рдВрдордзреНрдпреЗ рд╣реЗ рдЕрд╕реЗ рдЖрд╣реЗ.

рдкрд░рдВрддреБ рдХрдзреАрдХрдзреА рдЕрд╢реА рдкрд░рд┐рд╕реНрдерд┐рддреА рдЙрджреНрднрд╡реВ рд╢рдХрддреЗ рдЬреЗрд╡реНрд╣рд╛ рдЖрдкрд▓реНрдпрд╛рд▓рд╛ рдореВрд▓реНрдпрд╛рдВрдордзреНрдпреЗ рднрд┐рдиреНрди рдбреЗрдЯрд╛ рдкреНрд░рдХрд╛рд░ рдЕрд╕рд▓реЗрд▓реНрдпрд╛ рд╕реНрддрдВрднрд╛рдВрдордзреВрди рдбреЗрдЯрд╛ рдЧреЛрд│рд╛ рдХрд░рдгреНрдпрд╛рдЪреА рдЖрд╡рд╢реНрдпрдХрддрд╛ рдЕрд╕рддреЗ. рд▓реЗрдЧрд╕реА рдлрдВрдХреНрд╢рди рд╡рд╛рдкрд░рдгреЗ spread() рд╣реЗ рдХрд░рдгреЗ рдЦреВрдк рдХрдареАрдг рд╣реЛрдИрд▓.

рдЦрд╛рд▓реАрд▓ рдЙрджрд╛рд╣рд░рдгрд╛рд╡рд░реВрди рдШреЗрддрд▓реЗ рдЖрд╣реЗ рд╡рд┐рдЧреНрдиреЗрдЯреНрд╕ рдкреЕрдХреЗрдЬрд▓рд╛ рдбреЗрдЯрд╛.рдЯреЗрдмрд▓.

рдЪрд▓рд╛ рдкреНрд░рд╢рд┐рдХреНрд╖рдг рдбреЗрдЯрд╛рдлреНрд░реЗрдо рддрдпрд╛рд░ рдХрд░реВрдпрд╛.

family <- tibble::tribble(
  ~family,  ~dob_child1,  ~dob_child2, ~gender_child1, ~gender_child2,
       1L, "1998-11-26", "2000-01-29",             1L,             2L,
       2L, "1996-06-22",           NA,             2L,             NA,
       3L, "2002-07-11", "2004-04-05",             2L,             2L,
       4L, "2004-10-10", "2009-08-27",             1L,             1L,
       5L, "2000-12-05", "2005-02-28",             2L,             1L,
)
family <- family %>% mutate_at(vars(starts_with("dob")), parse_date)

#> # A tibble: 5 x 5
#>   family dob_child1 dob_child2 gender_child1 gender_child2
#>    <int> <date>     <date>             <int>         <int>
#> 1      1 1998-11-26 2000-01-29             1             2
#> 2      2 1996-06-22 NA                     2            NA
#> 3      3 2002-07-11 2004-04-05             2             2
#> 4      4 2004-10-10 2009-08-27             1             1
#> 5      5 2000-12-05 2005-02-28             2             1

рддрдпрд╛рд░ рдХреЗрд▓реЗрд▓реНрдпрд╛ рддрд╛рд░реАрдЦ рдлреНрд░реЗрдордордзреНрдпреЗ рдкреНрд░рддреНрдпреЗрдХ рдУрд│реАрдд рдПрдХрд╛ рдХреБрдЯреБрдВрдмрд╛рддреАрд▓ рдореБрд▓рд╛рдВрдЪрд╛ рдбреЗрдЯрд╛ рдЕрд╕рддреЛ. рдХреБрдЯреБрдВрдмрд╛рдВрдирд╛ рдПрдХ рдХрд┐рдВрд╡рд╛ рджреЛрди рдореБрд▓реЗ рдЕрд╕реВ рд╢рдХрддрд╛рдд. рдкреНрд░рддреНрдпреЗрдХ рдореБрд▓рд╛рд╕рд╛рдареА, рдЬрдиреНрдорддрд╛рд░реАрдЦ рдЖрдгрд┐ рд▓рд┐рдВрдЧ рдпрд╛рд╡рд░ рдбреЗрдЯрд╛ рдкреНрд░рджрд╛рди рдХреЗрд▓рд╛ рдЬрд╛рддреЛ рдЖрдгрд┐ рдкреНрд░рддреНрдпреЗрдХ рдореБрд▓рд╛рд╕рд╛рдареА рдбреЗрдЯрд╛ рд╕реНрд╡рддрдВрддреНрд░ рд╕реНрддрдВрднрд╛рдВрдордзреНрдпреЗ рдЕрд╕рддреЛ, рд╡рд┐рд╢реНрд▓реЗрд╖рдгрд╛рд╕рд╛рдареА рд╣рд╛ рдбреЗрдЯрд╛ рдпреЛрдЧреНрдп рд╕реНрд╡рд░реВрдкрд╛рдд рдЖрдгрдгреЗ рд╣реЗ рдЖрдордЪреЗ рдХрд╛рд░реНрдп рдЖрд╣реЗ.

рдХреГрдкрдпрд╛ рд▓рдХреНрд╖рд╛рдд рдШреНрдпрд╛ рдХреА рдЖрдордЪреНрдпрд╛рдХрдбреЗ рдкреНрд░рддреНрдпреЗрдХ рдореБрд▓рд╛рдмрджреНрджрд▓ рдорд╛рд╣рд┐рддреА рдЕрд╕рд▓реЗрд▓реЗ рджреЛрди рдЪрд▓ рдЖрд╣реЗрдд: рддреНрдпрд╛рдВрдЪреЗ рд▓рд┐рдВрдЧ рдЖрдгрд┐ рдЬрдиреНрдорддрд╛рд░реАрдЦ (рдЙрдкрд╕рд░реНрдЧ рдЕрд╕рд▓реЗрд▓реЗ рд╕реНрддрдВрдн рдбреЙрдк рдЬрдиреНрдорддрд╛рд░реАрдЦ, рдЙрдкрд╕рд░реНрдЧ рдЕрд╕рд▓реЗрд▓реЗ рд╕реНрддрдВрдн рд▓рд┐рдВрдЧ рдореБрд▓рд╛рдЪреЗ рд▓рд┐рдВрдЧ рд╕рдорд╛рд╡рд┐рд╖реНрдЯ рдХрд░рд╛). рдЕрдкреЗрдХреНрд╖рд┐рдд рдкрд░рд┐рдгрд╛рдо рдЕрд╕рд╛ рдЖрд╣реЗ рдХреА рддреЗ рд╕реНрд╡рддрдВрддреНрд░ рд╕реНрддрдВрднрд╛рдВрдордзреНрдпреЗ рджрд┐рд╕рд▓реЗ рдкрд╛рд╣рд┐рдЬреЗрдд. рдХреЙрд▓рдордордзреНрдпреЗ рд╕реНрдкреЗрд╕рд┐рдлрд┐рдХреЗрд╢рди рддрдпрд╛рд░ рдХрд░реВрди рдЖрдкрдг рд╣реЗ рдХрд░реВ рд╢рдХрддреЛ .value рджреЛрди рднрд┐рдиреНрди рдЕрд░реНрде рдЕрд╕рддреАрд▓.

spec <- family %>%
  pivot_longer_spec(-family) %>%
  separate(col = name, into = c(".value", "child"))%>%
  mutate(child = parse_number(child))

#> # A tibble: 4 x 3
#>   .name         .value child
#>   <chr>         <chr>  <dbl>
#> 1 dob_child1    dob        1
#> 2 dob_child2    dob        2
#> 3 gender_child1 gender     1
#> 4 gender_child2 gender     2

рддрд░, рд╡рд░реАрд▓ рдХреЛрдбрджреНрд╡рд╛рд░реЗ рдХреЗрд▓реЗрд▓реНрдпрд╛ рдХреНрд░рд┐рдпрд╛рдВрдХрдбреЗ рдЪрд░рдг-рджрд░-рдЪрд░рдг рдкрд╛рд╣реВ.

  • pivot_longer_spec(-family) тАФ рдлреЕрдорд┐рд▓реА рдХреЙрд▓рдо рд╡рдЧрд│рддрд╛ рд╕рд░реНрд╡ рд╡рд┐рджреНрдпрдорд╛рди рд╕реНрддрдВрдн рд╕рдВрдХреБрдЪрд┐рдд рдХрд░рдгрд╛рд░реЗ рддрдкрд╢реАрд▓ рддрдпрд╛рд░ рдХрд░рд╛.
  • separate(col = name, into = c(".value", "child")) - рд╕реНрддрдВрдн рд╡рд┐рднрд╛рдЬрд┐рдд рдХрд░рд╛ .рдХреГрдкрдпрд╛, рдЬреНрдпрд╛рдордзреНрдпреЗ рд╕реНрддреНрд░реЛрдд рдлреАрд▓реНрдбрдЪреА рдирд╛рд╡реЗ рдЖрд╣реЗрдд, рдЕрдВрдбрд░рд╕реНрдХреЛрд░ рд╡рд╛рдкрд░реВрди рдЖрдгрд┐ рдкрд░рд┐рдгрд╛рдореА рдореВрд▓реНрдпреЗ рд╕реНрддрдВрднрд╛рдВрдордзреНрдпреЗ рдкреНрд░рд╡рд┐рд╖реНрдЯ рдХрд░рдгреЗ .рдореВрд▓реНрдп ╨╕ рдореБрд▓рд╛рд▓рд╛.
  • mutate(child = parse_number(child)) - рдлреАрд▓реНрдб рдореВрд▓реНрдпреЗ рдмрджрд▓рд╛ рдореБрд▓рд╛рд▓рд╛ рдордЬрдХреВрд░ рддреЗ рдЕрдВрдХреАрдп рдбреЗрдЯрд╛ рдкреНрд░рдХрд╛рд░.

рдЖрддрд╛ рдЖрдкрдг рдореВрд│ рдбреЗрдЯрд╛рдлреНрд░реЗрдорд╡рд░ рдкрд░рд┐рдгрд╛рдореА рддрдкрд╢реАрд▓ рд▓рд╛рдЧреВ рдХрд░реВ рд╢рдХрддреЛ рдЖрдгрд┐ рдЯреЗрдмрд▓рд▓рд╛ рдЗрдЪреНрдЫрд┐рдд рдлреЙрд░реНрдордордзреНрдпреЗ рдЖрдгреВ рд╢рдХрддреЛ.

family %>% 
    pivot_longer(spec = spec, na.rm = T)

#> # A tibble: 9 x 4
#>   family child dob        gender
#>    <int> <dbl> <date>      <int>
#> 1      1     1 1998-11-26      1
#> 2      1     2 2000-01-29      2
#> 3      2     1 1996-06-22      2
#> 4      3     1 2002-07-11      2
#> 5      3     2 2004-04-05      2
#> 6      4     1 2004-10-10      1
#> 7      4     2 2009-08-27      1
#> 8      5     1 2000-12-05      2
#> 9      5     2 2005-02-28      1

рдЖрдореНрд╣реА рдпреБрдХреНрддрд┐рд╡рд╛рдж рд╡рд╛рдкрд░рддреЛ na.rm = TRUE, рдХрд╛рд░рдг рдбреЗрдЯрд╛рдЪреЗ рд╡рд░реНрддрдорд╛рди рд╕реНрд╡рд░реВрдк рдЕрд╕реНрддрд┐рддреНрд╡рд╛рдд рдирд╕рд▓реЗрд▓реНрдпрд╛ рдирд┐рд░реАрдХреНрд╖рдгрд╛рдВрд╕рд╛рдареА рдЕрддрд┐рд░рд┐рдХреНрдд рдкрдВрдХреНрддреА рддрдпрд╛рд░ рдХрд░рдгреНрдпрд╛рд╕ рднрд╛рдЧ рдкрд╛рдбрддреЗ. рдХрд╛рд░рдг рдХреБрдЯреБрдВрдм 2 рдордзреНрдпреЗ рдПрдХрдЪ рдореВрд▓ рдЖрд╣реЗ, na.rm = TRUE рдЖрдЙрдЯрдкреБрдЯрдордзреНрдпреЗ рдХреБрдЯреБрдВрдм 2 рдЪреА рдПрдХ рдкрдВрдХреНрддреА рдЕрд╕реЗрд▓ рдпрд╛рдЪреА рд╣рдореА рджреЗрддреЗ.

рддрд╛рд░реАрдЦ рдлреНрд░реЗрдо рд▓рд╛рдБрдЧ рдордзреВрди рд░реБрдВрдж рдлреЙрд░рдореЕрдЯрдордзреНрдпреЗ рд░реВрдкрд╛рдВрддрд░рд┐рдд рдХрд░рдд рдЖрд╣реЗ

pivot_wider() - рд╣реЗ рд╡реНрдпрд╕реНрдд рдкрд░рд┐рд╡рд░реНрддрди рдЖрд╣реЗ, рдЖрдгрд┐ рдЙрд▓рдЯ рдкрдВрдХреНрддреАрдВрдЪреА рд╕рдВрдЦреНрдпрд╛ рдХрдореА рдХрд░реВрди рддрд╛рд░реАрдЦ рдлреНрд░реЗрдордЪреНрдпрд╛ рд╕реНрддрдВрднрд╛рдВрдЪреА рд╕рдВрдЦреНрдпрд╛ рд╡рд╛рдврд╡рддреЗ.

рдЖрд░ рдкреЕрдХреЗрдЬ tidyr рдЖрдгрд┐ рддреНрдпрд╛рдЪреА рдирд╡реАрди рдХрд╛рд░реНрдпреЗ pivot_longer рдЖрдгрд┐ pivot_wider

рдбреЗрдЯрд╛ рдЕрдЪреВрдХ рд╕реНрд╡рд░реВрдкрд╛рдд рдЖрдгрдгреНрдпрд╛рд╕рд╛рдареА рдпрд╛ рдкреНрд░рдХрд╛рд░рдЪреЗ рдкрд░рд┐рд╡рд░реНрддрди рдЕрддреНрдпрдВрдд рдХреНрд╡рдЪрд┐рддрдЪ рд╡рд╛рдкрд░рд▓реЗ рдЬрд╛рддреЗ, рддрдерд╛рдкрд┐, рд╣реЗ рддрдВрддреНрд░ рд╕рд╛рджрд░реАрдХрд░рдгрд╛рдВрдордзреНрдпреЗ рд╡рд╛рдкрд░рд▓реНрдпрд╛ рдЬрд╛рдгрд╛рд▒реНрдпрд╛ рдкрд┐рд╡реНрд╣реЛрдЯ рдЯреЗрдмрд▓реНрд╕ рддрдпрд╛рд░ рдХрд░рдгреНрдпрд╛рд╕рд╛рдареА рдХрд┐рдВрд╡рд╛ рдХрд╛рд╣реА рдЗрддрд░ рд╕рд╛рдзрдирд╛рдВрд╕рд╣ рдПрдХрддреНрд░реАрдХрд░рдгрд╛рд╕рд╛рдареА рдЙрдкрдпреБрдХреНрдд рдард░реВ рд╢рдХрддреЗ.

рдкреНрд░рддреНрдпрдХреНрд╖рд╛рдд рдХрд╛рд░реНрдпреЗ pivot_longer() ╨╕ pivot_wider() рд╕рдордорд┐рддреАрдп рдЕрд╕рддрд╛рдд рдЖрдгрд┐ рдПрдХрдореЗрдХрд╛рдВрдЪреНрдпрд╛ рдЙрд▓рдЯ рдХреНрд░рд┐рдпрд╛ рдирд┐рд░реНрдорд╛рдг рдХрд░рддрд╛рдд, рдореНрд╣рдгрдЬреЗ: df %>% pivot_longer(spec = spec) %>% pivot_wider(spec = spec) ╨╕ df %>% pivot_wider(spec = spec) %>% pivot_longer(spec = spec) рдореВрд│ df рдкрд░рдд рдХрд░реЗрд▓.

рд╕рд╛рд░рдгреАрд▓рд╛ рд╡рд┐рд╕реНрддреГрдд рд╕реНрд╡рд░реВрдкрд╛рдд рд░реВрдкрд╛рдВрддрд░рд┐рдд рдХрд░рдгреНрдпрд╛рдЪреЗ рд╕рд░реНрд╡рд╛рдд рд╕реЛрдкреЗ рдЙрджрд╛рд╣рд░рдг

рдлрдВрдХреНрд╢рди рдХрд╕реЗ рдХрд╛рд░реНрдп рдХрд░рддреЗ рд╣реЗ рджрд╛рдЦрд╡рдгреНрдпрд╛рд╕рд╛рдареА pivot_wider() рдЖрдореНрд╣реА рдбреЗрдЯрд╛рд╕реЗрдЯ рд╡рд╛рдкрд░реВ рдорд╛рд╕реЗ_рднреЗрдЯрдгреЗ, рдЬреЗ рд╡рд┐рд╡рд┐рдз рд╕реНрдЯреЗрд╢рдиреНрд╕ рдирджреАрдХрд╛рдареА рдорд╛рд╢рд╛рдВрдЪреНрдпрд╛ рд╣рд╛рд▓рдЪрд╛рд▓реАрдВрдЪреА рдиреЛрдВрдж рдХрд╢реА рдХрд░рддрд╛рдд рдпрд╛рдмрджреНрджрд▓ рдорд╛рд╣рд┐рддреА рд╕рдВрдЧреНрд░рд╣рд┐рдд рдХрд░рддреЗ.

#> # A tibble: 114 x 3
#>    fish  station  seen
#>    <fct> <fct>   <int>
#>  1 4842  Release     1
#>  2 4842  I80_1       1
#>  3 4842  Lisbon      1
#>  4 4842  Rstr        1
#>  5 4842  Base_TD     1
#>  6 4842  BCE         1
#>  7 4842  BCW         1
#>  8 4842  BCE2        1
#>  9 4842  BCW2        1
#> 10 4842  MAE         1
#> # тАж with 104 more rows

рдмрд▒реНрдпрд╛рдЪ рдкреНрд░рдХрд░рдгрд╛рдВрдордзреНрдпреЗ, рдЬрд░ рддреБрдореНрд╣реА рдкреНрд░рддреНрдпреЗрдХ рд╕реНрдЯреЗрд╢рдирдЪреА рдорд╛рд╣рд┐рддреА рд╡реЗрдЧрд│реНрдпрд╛ рдХреЙрд▓рдордордзреНрдпреЗ рд╕рд╛рджрд░ рдХреЗрд▓реА рддрд░ рд╣реЗ рдЯреЗрдмрд▓ рдЕрдзрд┐рдХ рдорд╛рд╣рд┐рддреАрдкреВрд░реНрдг рдЖрдгрд┐ рд╡рд╛рдкрд░рдгреНрдпрд╛рд╕ рд╕реЛрдкреЗ рд╣реЛрдИрд▓.

fish_encounters %>% pivot_wider(names_from = station, values_from = seen)

fish_encounters %>% pivot_wider(names_from = station, values_from = seen)
#> # A tibble: 19 x 12
#>    fish  Release I80_1 Lisbon  Rstr Base_TD   BCE   BCW  BCE2  BCW2   MAE
#>    <fct>   <int> <int>  <int> <int>   <int> <int> <int> <int> <int> <int>
#>  1 4842        1     1      1     1       1     1     1     1     1     1
#>  2 4843        1     1      1     1       1     1     1     1     1     1
#>  3 4844        1     1      1     1       1     1     1     1     1     1
#>  4 4845        1     1      1     1       1    NA    NA    NA    NA    NA
#>  5 4847        1     1      1    NA      NA    NA    NA    NA    NA    NA
#>  6 4848        1     1      1     1      NA    NA    NA    NA    NA    NA
#>  7 4849        1     1     NA    NA      NA    NA    NA    NA    NA    NA
#>  8 4850        1     1     NA     1       1     1     1    NA    NA    NA
#>  9 4851        1     1     NA    NA      NA    NA    NA    NA    NA    NA
#> 10 4854        1     1     NA    NA      NA    NA    NA    NA    NA    NA
#> # тАж with 9 more rows, and 1 more variable: MAW <int>

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

рддрдерд╛рдкрд┐, рдпрд╛ рдкреНрд░рдХрд░рдгрд╛рдд рдЖрдореНрд╣рд╛рд▓рд╛ рдорд╛рд╣рд┐рдд рдЖрд╣реЗ рдХреА рд░реЗрдХреЙрд░реНрдб рдирд╕рдгреЗ рдореНрд╣рдгрдЬреЗ рдорд╛рд╕реЗ рджрд┐рд╕рд▓реЗ рдирд╛рд╣реАрдд, рдореНрд╣рдгреВрди рдЖрдореНрд╣реА рдпреБрдХреНрддрд┐рд╡рд╛рдж рд╡рд╛рдкрд░реВ рд╢рдХрддреЛ values_fill рдХрд╛рд░реНрдпрд╛рдд pivot_wider() рдЖрдгрд┐ рд╣реА рдЧрд╣рд╛рд│ рдореВрд▓реНрдпреЗ рд╢реВрдиреНрдпрд╛рдиреЗ рднрд░рд╛:

fish_encounters %>% pivot_wider(
  names_from = station, 
  values_from = seen,
  values_fill = list(seen = 0)
)

#> # A tibble: 19 x 12
#>    fish  Release I80_1 Lisbon  Rstr Base_TD   BCE   BCW  BCE2  BCW2   MAE
#>    <fct>   <int> <int>  <int> <int>   <int> <int> <int> <int> <int> <int>
#>  1 4842        1     1      1     1       1     1     1     1     1     1
#>  2 4843        1     1      1     1       1     1     1     1     1     1
#>  3 4844        1     1      1     1       1     1     1     1     1     1
#>  4 4845        1     1      1     1       1     0     0     0     0     0
#>  5 4847        1     1      1     0       0     0     0     0     0     0
#>  6 4848        1     1      1     1       0     0     0     0     0     0
#>  7 4849        1     1      0     0       0     0     0     0     0     0
#>  8 4850        1     1      0     1       1     1     1     0     0     0
#>  9 4851        1     1      0     0       0     0     0     0     0     0
#> 10 4854        1     1      0     0       0     0     0     0     0     0
#> # тАж with 9 more rows, and 1 more variable: MAW <int>

рдПрдХрд╛рдзрд┐рдХ рд╕реНрддреНрд░реЛрдд рд╡реНрд╣реЗрд░рд┐рдПрдмрд▓реНрд╕рдордзреВрди рд╕реНрддрдВрдн рдирд╛рд╡ рддрдпрд╛рд░ рдХрд░рдгреЗ

рдХрд▓реНрдкрдирд╛ рдХрд░рд╛ рдХреА рдЖрдордЪреНрдпрд╛рдХрдбреЗ рдЙрддреНрдкрд╛рджрди, рджреЗрд╢ рдЖрдгрд┐ рд╡рд░реНрд╖ рдпрд╛рдВрдЪреЗ рд╕рдВрдпреЛрдЬрди рдЕрд╕рд▓реЗрд▓реЗ рдЯреЗрдмрд▓ рдЖрд╣реЗ. рдЪрд╛рдЪрдгреА рддрд╛рд░реАрдЦ рдлреНрд░реЗрдо рд╡реНрдпреБрддреНрдкрдиреНрди рдХрд░рдгреНрдпрд╛рд╕рд╛рдареА, рддреБрдореНрд╣реА рдЦрд╛рд▓реАрд▓ рдХреЛрдб рдЪрд╛рд▓рд╡реВ рд╢рдХрддрд╛:

df <- expand_grid(
  product = c("A", "B"), 
  country = c("AI", "EI"), 
  year = 2000:2014
) %>%
  filter((product == "A" & country == "AI") | product == "B") %>% 
  mutate(value = rnorm(nrow(.)))

#> # A tibble: 45 x 4
#>    product country  year    value
#>    <chr>   <chr>   <int>    <dbl>
#>  1 A       AI       2000 -2.05   
#>  2 A       AI       2001 -0.676  
#>  3 A       AI       2002  1.60   
#>  4 A       AI       2003 -0.353  
#>  5 A       AI       2004 -0.00530
#>  6 A       AI       2005  0.442  
#>  7 A       AI       2006 -0.610  
#>  8 A       AI       2007 -2.77   
#>  9 A       AI       2008  0.899  
#> 10 A       AI       2009 -0.106  
#> # тАж with 35 more rows

рдЖрдордЪреЗ рдХрд╛рд░реНрдп рдбреЗрдЯрд╛ рдлреНрд░реЗрдордЪрд╛ рд╡рд┐рд╕реНрддрд╛рд░ рдХрд░рдгреЗ рдЖрд╣реЗ рдЬреЗрдгреЗрдХрд░реВрди рдПрдХрд╛ рд╕реНрддрдВрднрд╛рдд рдЙрддреНрдкрд╛рджрди рдЖрдгрд┐ рджреЗрд╢рд╛рдЪреНрдпрд╛ рдкреНрд░рддреНрдпреЗрдХ рд╕рдВрдпреЛрдЬрдирд╛рд╕рд╛рдареА рдбреЗрдЯрд╛ рдЕрд╕реЗрд▓. рд╣реЗ рдХрд░рдгреНрдпрд╛рд╕рд╛рдареА, рдлрдХреНрдд рдпреБрдХреНрддрд┐рд╡рд╛рдж рдкрд╛рд╕ рдХрд░рд╛ рдирд╛рд╡реЗ_рдХрдбреВрди рд╡рд┐рд▓реАрди рдХрд░рдгреНрдпрд╛рдЪреНрдпрд╛ рдлреАрд▓реНрдбрдЪреА рдирд╛рд╡реЗ рдЕрд╕рд▓реЗрд▓рд╛ рд╕рджрд┐рд╢.

df %>% pivot_wider(names_from = c(product, country),
                 values_from = "value")

#> # A tibble: 15 x 4
#>     year     A_AI    B_AI    B_EI
#>    <int>    <dbl>   <dbl>   <dbl>
#>  1  2000 -2.05     0.607   1.20  
#>  2  2001 -0.676    1.65   -0.114 
#>  3  2002  1.60    -0.0245  0.501 
#>  4  2003 -0.353    1.30   -0.459 
#>  5  2004 -0.00530  0.921  -0.0589
#>  6  2005  0.442   -1.55    0.594 
#>  7  2006 -0.610    0.380  -1.28  
#>  8  2007 -2.77     0.830   0.637 
#>  9  2008  0.899    0.0175 -1.30  
#> 10  2009 -0.106   -0.195   1.03  
#> # тАж with 5 more rows

рддреБрдореНрд╣реА рдлрдВрдХреНрд╢рдирд╕рд╛рдареА рддрдкрд╢реАрд▓ рджреЗрдЦреАрд▓ рд▓рд╛рдЧреВ рдХрд░реВ рд╢рдХрддрд╛ pivot_wider(). рдкрдг рд╕рд╛рджрд░ рдХреЗрд▓реНрдпрд╛рд╡рд░ pivot_wider() рд╕реНрдкреЗрд╕рд┐рдлрд┐рдХреЗрд╢рди рдЙрд▓рдЯ рд░реВрдкрд╛рдВрддрд░рдг рдХрд░рддреЗ pivot_longer(): рдордзреНрдпреЗ рдирд┐рд░реНрджрд┐рд╖реНрдЯ рдХреЗрд▓реЗрд▓реЗ рд╕реНрддрдВрдн .рдХреГрдкрдпрд╛, рдкрд╛рд╕реВрди рдореВрд▓реНрдпреЗ рд╡рд╛рдкрд░реВрди .рдореВрд▓реНрдп рдЖрдгрд┐ рдЗрддрд░ рд╕реНрддрдВрдн.

рдпрд╛ рдбреЗрдЯрд╛рд╕реЗрдЯрд╕рд╛рдареА, рддреБрдореНрд╣рд╛рд▓рд╛ рдкреНрд░рддреНрдпреЗрдХ рд╕рдВрднрд╛рд╡реНрдп рджреЗрд╢ рдЖрдгрд┐ рдЙрддреНрдкрд╛рджрди рд╕рдВрдпреЛрдЬрдирд╛рдЪрд╛ рд╕реНрд╡рддрдГрдЪрд╛ рд╕реНрддрдВрдн рдЕрд╕рд╛рд╡рд╛ рдЕрд╕реЗ рд╡рд╛рдЯрдд рдЕрд╕рд▓реНрдпрд╛рд╕, рддреБрдореНрд╣реА рдПрдХ рд╕рд╛рдиреБрдХреВрд▓ рддрдкрд╢реАрд▓ рд╡реНрдпреБрддреНрдкрдиреНрди рдХрд░реВ рд╢рдХрддрд╛, рдХреЗрд╡рд│ рдбреЗрдЯрд╛рдордзреНрдпреЗ рдЙрдкрд╕реНрдерд┐рдд рдЕрд╕рд▓реЗрд▓реЗ рдирд╛рд╣реА:

spec <- df %>% 
  expand(product, country, .value = "value") %>% 
  unite(".name", product, country, remove = FALSE)

#> # A tibble: 4 x 4
#>   .name product country .value
#>   <chr> <chr>   <chr>   <chr> 
#> 1 A_AI  A       AI      value 
#> 2 A_EI  A       EI      value 
#> 3 B_AI  B       AI      value 
#> 4 B_EI  B       EI      value

df %>% pivot_wider(spec = spec) %>% head()

#> # A tibble: 6 x 5
#>    year     A_AI  A_EI    B_AI    B_EI
#>   <int>    <dbl> <dbl>   <dbl>   <dbl>
#> 1  2000 -2.05       NA  0.607   1.20  
#> 2  2001 -0.676      NA  1.65   -0.114 
#> 3  2002  1.60       NA -0.0245  0.501 
#> 4  2003 -0.353      NA  1.30   -0.459 
#> 5  2004 -0.00530    NA  0.921  -0.0589
#> 6  2005  0.442      NA -1.55    0.594

рдирд╡реАрди tidyr рд╕рдВрдХрд▓реНрдкрдиреЗрд╕рд╣ рдХрд╛рд░реНрдп рдХрд░рдгреНрдпрд╛рдЪреА рдЕрдиреЗрдХ рдкреНрд░рдЧрдд рдЙрджрд╛рд╣рд░рдгреЗ

рдЙрджрд╛рд╣рд░рдг рдореНрд╣рдгреВрди рдпреВрдПрд╕ рдЬрдирдЧрдгрдирд╛ рдЙрддреНрдкрдиреНрди рдЖрдгрд┐ рднрд╛рдбреЗ рдбреЗрдЯрд╛рд╕реЗрдЯ рд╡рд╛рдкрд░реВрди рдбреЗрдЯрд╛ рд╕рд╛рдл рдХрд░рдгреЗ.

рдбреЗрдЯрд╛ рд╕реЗрдЯ рдЖрдореНрд╣рд╛рд▓рд╛_рднрд╛рдбреЗ_рдЙрддреНрдкрдиреНрди 2017 рд╕рд╛рдареА рдпреВрдПрд╕ рдордзреАрд▓ рдкреНрд░рддреНрдпреЗрдХ рд░рд╛рдЬреНрдпрд╛рд╕рд╛рдареА рд╕рд░рд╛рд╕рд░реА рдЙрддреНрдкрдиреНрди рдЖрдгрд┐ рднрд╛рдбреЗ рдорд╛рд╣рд┐рддреА рд╕рдорд╛рд╡рд┐рд╖реНрдЯ рдЖрд╣реЗ (рдбреЗрдЯрд╛ рд╕рдВрдЪ рдкреЕрдХреЗрдЬрдордзреНрдпреЗ рдЙрдкрд▓рдмреНрдз рдЖрд╣реЗ рд╡реНрдпрд╡рд╕реНрдерд┐рдд рдЬрдирдЧрдгрдирд╛).

us_rent_income
#> # A tibble: 104 x 5
#>    GEOID NAME       variable estimate   moe
#>    <chr> <chr>      <chr>       <dbl> <dbl>
#>  1 01    Alabama    income      24476   136
#>  2 01    Alabama    rent          747     3
#>  3 02    Alaska     income      32940   508
#>  4 02    Alaska     rent         1200    13
#>  5 04    Arizona    income      27517   148
#>  6 04    Arizona    rent          972     4
#>  7 05    Arkansas   income      23789   165
#>  8 05    Arkansas   rent          709     5
#>  9 06    California income      29454   109
#> 10 06    California rent         1358     3
#> # тАж with 94 more rows

рдбреЗрдЯрд╛рд╕реЗрдЯрдордзреНрдпреЗ рдбреЗрдЯрд╛ рдЬреНрдпрд╛ рдлреЙрд░реНрдордордзреНрдпреЗ рд╕рдВрдЧреНрд░рд╣рд┐рдд рдХреЗрд▓рд╛ рдЬрд╛рддреЛ рдЖрдореНрд╣рд╛рд▓рд╛_рднрд╛рдбреЗ_рдЙрддреНрдкрдиреНрди рддреНрдпрд╛рдВрдЪреНрдпрд╛рд╕рд╣ рдХрд╛рд░реНрдп рдХрд░рдгреЗ рдЕрддреНрдпрдВрдд рдЧреИрд░рд╕реЛрдпреАрдЪреЗ рдЖрд╣реЗ, рдореНрд╣рдгреВрди рдЖрдореНрд╣реА рд╕реНрддрдВрднрд╛рдВрд╕рд╣ рдбреЗрдЯрд╛ рд╕реЗрдЯ рддрдпрд╛рд░ рдХрд░реВ рдЗрдЪреНрдЫрд┐рддреЛ: рднрд╛рдбреЗ, рднрд╛рдбреЗ_рдореЛ, рдЖрд▓реЗ, рдЙрддреНрдкрдиреНрди_moe. рд╣реЗ рддрдкрд╢реАрд▓ рддрдпрд╛рд░ рдХрд░рдгреНрдпрд╛рдЪреЗ рдЕрдиреЗрдХ рдорд╛рд░реНрдЧ рдЖрд╣реЗрдд, рдкрд░рдВрддреБ рдореБрдЦреНрдп рдореБрджреНрджрд╛ рдЕрд╕рд╛ рдЖрд╣реЗ рдХреА рдЖрдкрд▓реНрдпрд╛рд▓рд╛ рд╡реНрд╣реЗрд░рд┐рдПрдмрд▓ рд╡реНрд╣реЕрд▓реНрдпреВрдЬ рдЖрдгрд┐ рдЕрдВрджрд╛рдЬ/moeрдЖрдгрд┐ рдирдВрддрд░ рд╕реНрддрдВрднрд╛рдЪреЗ рдирд╛рд╡ рддрдпрд╛рд░ рдХрд░рд╛.

  spec <- us_rent_income %>% 
    expand(variable, .value = c("estimate", "moe")) %>% 
    mutate(
      .name = paste0(variable, ifelse(.value == "moe", "_moe", ""))
    )

#> # A tibble: 4 x 3
#>   variable .value   .name     
#>   <chr>    <chr>    <chr>     
#> 1 income   estimate income    
#> 2 income   moe      income_moe
#> 3 rent     estimate rent      
#> 4 rent     moe      rent_moe

рд╣реЗ рддрдкрд╢реАрд▓ рдкреНрд░рджрд╛рди рдХрд░рдгреЗ pivot_wider() рдЖрдореНрд╣реА рд╢реЛрдзрдд рдЕрд╕рд▓реЗрд▓рд╛ рдкрд░рд┐рдгрд╛рдо рджреЗрддреЛ:

us_rent_income %>% pivot_wider(spec = spec)

#> # A tibble: 52 x 6
#>    GEOID NAME                 income income_moe  rent rent_moe
#>    <chr> <chr>                 <dbl>      <dbl> <dbl>    <dbl>
#>  1 01    Alabama               24476        136   747        3
#>  2 02    Alaska                32940        508  1200       13
#>  3 04    Arizona               27517        148   972        4
#>  4 05    Arkansas              23789        165   709        5
#>  5 06    California            29454        109  1358        3
#>  6 08    Colorado              32401        109  1125        5
#>  7 09    Connecticut           35326        195  1123        5
#>  8 10    Delaware              31560        247  1076       10
#>  9 11    District of Columbia  43198        681  1424       17
#> 10 12    Florida               25952         70  1077        3
#> # тАж with 42 more rows

рдЬрд╛рдЧрддрд┐рдХ рдмрдБрдХ

рдХрдзреАрдХрдзреА рдЗрдЪреНрдЫрд┐рдд рдлреЙрд░реНрдордордзреНрдпреЗ рдбреЗрдЯрд╛ рд╕реЗрдЯ рдЖрдгрдгреНрдпрд╛рд╕рд╛рдареА рдЕрдиреЗрдХ рдЪрд░рдгрд╛рдВрдЪреА рдЖрд╡рд╢реНрдпрдХрддрд╛ рдЕрд╕рддреЗ.
рдбреЗрдЯрд╛рд╕реЗрдЯ world_bank_pop 2000 рдЖрдгрд┐ 2018 рдордзреАрд▓ рдкреНрд░рддреНрдпреЗрдХ рджреЗрд╢рд╛рдЪреНрдпрд╛ рд▓реЛрдХрд╕рдВрдЦреНрдпреЗрд╡рд░ рдЬрд╛рдЧрддрд┐рдХ рдмрдБрдХреЗрдЪрд╛ рдбреЗрдЯрд╛ рдЖрд╣реЗ.

#> # A tibble: 1,056 x 20
#>    country indicator `2000` `2001` `2002` `2003`  `2004`  `2005`   `2006`
#>    <chr>   <chr>      <dbl>  <dbl>  <dbl>  <dbl>   <dbl>   <dbl>    <dbl>
#>  1 ABW     SP.URB.TтАж 4.24e4 4.30e4 4.37e4 4.42e4 4.47e+4 4.49e+4  4.49e+4
#>  2 ABW     SP.URB.GтАж 1.18e0 1.41e0 1.43e0 1.31e0 9.51e-1 4.91e-1 -1.78e-2
#>  3 ABW     SP.POP.TтАж 9.09e4 9.29e4 9.50e4 9.70e4 9.87e+4 1.00e+5  1.01e+5
#>  4 ABW     SP.POP.GтАж 2.06e0 2.23e0 2.23e0 2.11e0 1.76e+0 1.30e+0  7.98e-1
#>  5 AFG     SP.URB.TтАж 4.44e6 4.65e6 4.89e6 5.16e6 5.43e+6 5.69e+6  5.93e+6
#>  6 AFG     SP.URB.GтАж 3.91e0 4.66e0 5.13e0 5.23e0 5.12e+0 4.77e+0  4.12e+0
#>  7 AFG     SP.POP.TтАж 2.01e7 2.10e7 2.20e7 2.31e7 2.41e+7 2.51e+7  2.59e+7
#>  8 AFG     SP.POP.GтАж 3.49e0 4.25e0 4.72e0 4.82e0 4.47e+0 3.87e+0  3.23e+0
#>  9 AGO     SP.URB.TтАж 8.23e6 8.71e6 9.22e6 9.77e6 1.03e+7 1.09e+7  1.15e+7
#> 10 AGO     SP.URB.GтАж 5.44e0 5.59e0 5.70e0 5.76e0 5.75e+0 5.69e+0  4.92e+0
#> # тАж with 1,046 more rows, and 11 more variables: `2007` <dbl>,
#> #   `2008` <dbl>, `2009` <dbl>, `2010` <dbl>, `2011` <dbl>, `2012` <dbl>,
#> #   `2013` <dbl>, `2014` <dbl>, `2015` <dbl>, `2016` <dbl>, `2017` <dbl>

рдкреНрд░рддреНрдпреЗрдХ рд╡реНрд╣реЗрд░рд┐рдПрдмрд▓рд╕рд╣ рддреНрдпрд╛рдЪреНрдпрд╛ рд╕реНрд╡рддрдГрдЪреНрдпрд╛ рдХреЙрд▓рдордордзреНрдпреЗ рдПрдХ рд╡реНрдпрд╡рд╕реНрдерд┐рдд рдбреЗрдЯрд╛ рд╕реЗрдЯ рддрдпрд╛рд░ рдХрд░рдгреЗ рд╣реЗ рдЖрдордЪреЗ рдзреНрдпреЗрдп рдЖрд╣реЗ. рдирдХреНрдХреА рдХреЛрдгрддреНрдпрд╛ рдЪрд░рдгрд╛рдВрдЪреА рдЖрд╡рд╢реНрдпрдХрддрд╛ рдЖрд╣реЗ рд╣реЗ рд╕реНрдкрд╖реНрдЯ рдирд╛рд╣реА, рдкрд░рдВрддреБ рдЖрдореНрд╣реА рд╕рд░реНрд╡рд╛рдд рд╕реНрдкрд╖реНрдЯ рд╕рдорд╕реНрдпреЗрд╕рд╣ рдкреНрд░рд╛рд░рдВрдн рдХрд░реВ: рд╡рд░реНрд╖ рдЕрдиреЗрдХ рд╕реНрддрдВрднрд╛рдВрдордзреНрдпреЗ рдкрд╕рд░рд▓реЗрд▓реЗ рдЖрд╣реЗ.

рдпрд╛рдЪреЗ рдирд┐рд░рд╛рдХрд░рдг рдХрд░рдгреНрдпрд╛рд╕рд╛рдареА рддреБрдореНрд╣рд╛рд▓рд╛ рдлрдВрдХреНрд╢рди рд╡рд╛рдкрд░рд╛рд╡реЗ рд▓рд╛рдЧреЗрд▓ pivot_longer().

pop2 <- world_bank_pop %>% 
  pivot_longer(`2000`:`2017`, names_to = "year")

#> # A tibble: 19,008 x 4
#>    country indicator   year  value
#>    <chr>   <chr>       <chr> <dbl>
#>  1 ABW     SP.URB.TOTL 2000  42444
#>  2 ABW     SP.URB.TOTL 2001  43048
#>  3 ABW     SP.URB.TOTL 2002  43670
#>  4 ABW     SP.URB.TOTL 2003  44246
#>  5 ABW     SP.URB.TOTL 2004  44669
#>  6 ABW     SP.URB.TOTL 2005  44889
#>  7 ABW     SP.URB.TOTL 2006  44881
#>  8 ABW     SP.URB.TOTL 2007  44686
#>  9 ABW     SP.URB.TOTL 2008  44375
#> 10 ABW     SP.URB.TOTL 2009  44052
#> # тАж with 18,998 more rows

рдкреБрдвреАрд▓ рдкрд╛рдпрд░реА рдореНрд╣рдгрдЬреЗ рдЗрдВрдбрд┐рдХреЗрдЯрд░ рд╡реНрд╣реЗрд░рд┐рдПрдмрд▓ рдкрд╛рд╣рдгреЗ.
pop2 %>% count(indicator)

#> # A tibble: 4 x 2
#>   indicator       n
#>   <chr>       <int>
#> 1 SP.POP.GROW  4752
#> 2 SP.POP.TOTL  4752
#> 3 SP.URB.GROW  4752
#> 4 SP.URB.TOTL  4752

рдЬрд┐рдереЗ SP.POP.GROW рдореНрд╣рдгрдЬреЗ рд▓реЛрдХрд╕рдВрдЦреНрдпрд╛ рд╡рд╛рдв, SP.POP.TOTL рдореНрд╣рдгрдЬреЗ рдПрдХреВрдг рд▓реЛрдХрд╕рдВрдЦреНрдпрд╛ рдЖрдгрд┐ SP.URB. * рддреАрдЪ рдЧреЛрд╖реНрдЯ, рдкрдг рдлрдХреНрдд рд╢рд╣рд░реА рднрд╛рдЧрд╛рдВрд╕рд╛рдареА. рдЪрд▓рд╛ рд╣реА рдореВрд▓реНрдпреЗ рджреЛрди рд╡реНрд╣реЗрд░рд┐рдПрдмрд▓реНрд╕рдордзреНрдпреЗ рд╡рд┐рднрд╛рдЧреВ: рдХреНрд╖реЗрддреНрд░ - рдХреНрд╖реЗрддреНрд░ (рдПрдХреВрдг рдХрд┐рдВрд╡рд╛ рд╢рд╣рд░реА) рдЖрдгрд┐ рд╡рд╛рд╕реНрддрд╡рд┐рдХ рдбреЗрдЯрд╛ (рд▓реЛрдХрд╕рдВрдЦреНрдпрд╛ рдХрд┐рдВрд╡рд╛ рд╡рд╛рдв) рдЕрд╕рд▓реЗрд▓реЗ рд╡реНрд╣реЗрд░рд┐рдПрдмрд▓:

pop3 <- pop2 %>% 
  separate(indicator, c(NA, "area", "variable"))

#> # A tibble: 19,008 x 5
#>    country area  variable year  value
#>    <chr>   <chr> <chr>    <chr> <dbl>
#>  1 ABW     URB   TOTL     2000  42444
#>  2 ABW     URB   TOTL     2001  43048
#>  3 ABW     URB   TOTL     2002  43670
#>  4 ABW     URB   TOTL     2003  44246
#>  5 ABW     URB   TOTL     2004  44669
#>  6 ABW     URB   TOTL     2005  44889
#>  7 ABW     URB   TOTL     2006  44881
#>  8 ABW     URB   TOTL     2007  44686
#>  9 ABW     URB   TOTL     2008  44375
#> 10 ABW     URB   TOTL     2009  44052
#> # тАж with 18,998 more rows

рдЖрддрд╛ рдЖрдкрд▓реНрдпрд╛рд▓рд╛ рд╡реНрд╣реЗрд░рд┐рдПрдмрд▓рд▓рд╛ рджреЛрди рд╕реНрддрдВрднрд╛рдВрдордзреНрдпреЗ рд╡рд┐рднрд╛рдЬрд┐рдд рдХрд░рд╛рдпрдЪреЗ рдЖрд╣реЗ:

pop3 %>% 
  pivot_wider(names_from = variable, values_from = value)

#> # A tibble: 9,504 x 5
#>    country area  year   TOTL    GROW
#>    <chr>   <chr> <chr> <dbl>   <dbl>
#>  1 ABW     URB   2000  42444  1.18  
#>  2 ABW     URB   2001  43048  1.41  
#>  3 ABW     URB   2002  43670  1.43  
#>  4 ABW     URB   2003  44246  1.31  
#>  5 ABW     URB   2004  44669  0.951 
#>  6 ABW     URB   2005  44889  0.491 
#>  7 ABW     URB   2006  44881 -0.0178
#>  8 ABW     URB   2007  44686 -0.435 
#>  9 ABW     URB   2008  44375 -0.698 
#> 10 ABW     URB   2009  44052 -0.731 
#> # тАж with 9,494 more rows

рд╕рдВрдкрд░реНрдХ рдпрд╛рджреА

рдПрдХ рд╢реЗрд╡рдЯрдЪреЗ рдЙрджрд╛рд╣рд░рдг, рдХрд▓реНрдкрдирд╛ рдХрд░рд╛ рдХреА рддреБрдордЪреНрдпрд╛рдХрдбреЗ рд╕рдВрдкрд░реНрдХ рд╕реВрдЪреА рдЖрд╣реЗ рдЬреА рддреБрдореНрд╣реА рд╡реЗрдмрд╕рд╛рдЗрдЯрд╡рд░реВрди рдХреЙрдкреА рдЖрдгрд┐ рдкреЗрд╕реНрдЯ рдХреЗрд▓реА рдЖрд╣реЗ:

contacts <- tribble(
  ~field, ~value,
  "name", "Jiena McLellan",
  "company", "Toyota", 
  "name", "John Smith", 
  "company", "google", 
  "email", "john@google.com",
  "name", "Huxley Ratcliffe"
)

рдпрд╛ рдпрд╛рджреАрдЪреЗ рд╕рд╛рд░рдгреА рдмрдирд╡рдгреЗ рдЦреВрдк рдЕрд╡рдШрдб рдЖрд╣реЗ рдХрд╛рд░рдг рдХреЛрдгрддрд╛ рдбреЗрдЯрд╛ рдХреЛрдгрддреНрдпрд╛ рд╕рдВрдкрд░реНрдХрд╛рдЪрд╛ рдЖрд╣реЗ рд╣реЗ рдУрд│рдЦрдгрд╛рд░реЗ рдХреЛрдгрддреЗрд╣реА рдЪрд▓ рдирд╛рд╣реА. рдкреНрд░рддреНрдпреЗрдХ рдирд╡реАрди рд╕рдВрдкрд░реНрдХрд╛рдЪрд╛ рдбреЗрдЯрд╛ "рдирд╛рд╡" рдиреЗ рд╕реБрд░реВ рд╣реЛрддреЛ рд╣реЗ рд▓рдХреНрд╖рд╛рдд рдШреЗрдКрди рдЖрдореНрд╣реА рдпрд╛рдЪреЗ рдирд┐рд░рд╛рдХрд░рдг рдХрд░реВ рд╢рдХрддреЛ, рддреНрдпрд╛рдореБрд│реЗ рдЖрдореНрд╣реА рдПрдХ рдЕрджреНрд╡рд┐рддреАрдп рдЕрднрд┐рдЬреНрдЮрд╛рдкрдХ рддрдпрд╛рд░ рдХрд░реВ рд╢рдХрддреЛ рдЖрдгрд┐ рдкреНрд░рддреНрдпреЗрдХ рд╡реЗрд│реА рдлреАрд▓реНрдб рдХреЙрд▓рдордордзреНрдпреЗ "рдирд╛рд╡" рд╣реЗ рдореВрд▓реНрдп рдЕрд╕реЗрд▓ рддреЗрд╡реНрд╣рд╛ рддреЗ рдПрдХрд╛рдиреЗ рд╡рд╛рдврд╡реВ рд╢рдХрддреЛ:

contacts <- contacts %>% 
  mutate(
    person_id = cumsum(field == "name")
  )
contacts

#> # A tibble: 6 x 3
#>   field   value            person_id
#>   <chr>   <chr>                <int>
#> 1 name    Jiena McLellan           1
#> 2 company Toyota                   1
#> 3 name    John Smith               2
#> 4 company google                   2
#> 5 email   john@google.com          2
#> 6 name    Huxley Ratcliffe         3

рдЖрддрд╛ рдЖрдордЪреНрдпрд╛рдХрдбреЗ рдкреНрд░рддреНрдпреЗрдХ рд╕рдВрдкрд░реНрдХрд╛рд╕рд╛рдареА рдПрдХ рдЕрджреНрд╡рд┐рддреАрдп рдЖрдпрдбреА рдЖрд╣реЗ, рдЖрдореНрд╣реА рдлреАрд▓реНрдб рдЖрдгрд┐ рдореВрд▓реНрдп рд╕реНрддрдВрднрд╛рдВрдордзреНрдпреЗ рдмрджрд▓реВ рд╢рдХрддреЛ:

contacts %>% 
  pivot_wider(names_from = field, values_from = value)

#> # A tibble: 3 x 4
#>   person_id name             company email          
#>       <int> <chr>            <chr>   <chr>          
#> 1         1 Jiena McLellan   Toyota  <NA>           
#> 2         2 John Smith       google  john@google.com
#> 3         3 Huxley Ratcliffe <NA>    <NA>

рдирд┐рд╖реНрдХрд░реНрд╖

рдирд╡реАрди рд╕рдВрдХрд▓реНрдкрдирд╛ рдЕрд╕реЗ рдорд╛рдЭреЗ рд╡реИрдпрдХреНрддрд┐рдХ рдордд рдЖрд╣реЗ рд╡реНрдпрд╡рд╕реНрдерд┐рдд рдЦрд░реЛрдЦрд░ рдЕрдзрд┐рдХ рдЕрдВрддрд░реНрдЬреНрдЮрд╛рдиреА, рдЖрдгрд┐ рд▓реЗрдЧрд╕реА рдлрдВрдХреНрд╢рдиреНрд╕рдЪреНрдпрд╛ рдХрд╛рд░реНрдпрдХреНрд╖рдорддреЗрдордзреНрдпреЗ рд▓рдХреНрд╖рдгреАрдпрд░реАрддреНрдпрд╛ рдЙрддреНрдХреГрд╖реНрдЯ spread() ╨╕ gather(). рдорд▓рд╛ рдЖрд╢рд╛ рдЖрд╣реЗ рдХреА рдпрд╛ рд▓реЗрдЦрд╛рдиреЗ рддреБрдореНрд╣рд╛рд▓рд╛ рд╕рд╛рдореЛрд░реЗ рдЬрд╛рдгреНрдпрд╛рд╕ рдорджрдд рдХреЗрд▓реА рдЖрд╣реЗ pivot_longer() ╨╕ pivot_wider().

рд╕реНрддреНрд░реЛрдд: www.habr.com

DDoS рд╕рдВрд░рдХреНрд╖рдг, VPS VDS рд╕рд░реНрд╡реНрд╣рд░ рдЕрд╕рд▓реЗрд▓реНрдпрд╛ рд╕рд╛рдЗрдЯрд╕рд╛рдареА рд╡рд┐рд╢реНрд╡рд╕рдиреАрдп рд╣реЛрд╕реНрдЯрд┐рдВрдЧ рдЦрд░реЗрджреА рдХрд░рд╛ ЁЯФе рдбреАрдбреЙрд╕ рд╕рдВрд░рдХреНрд╖рдгрд╛рд╕рд╣ рд╡рд┐рд╢реНрд╡рд╕рдиреАрдп рд╡реЗрдмрд╕рд╛рдЗрдЯ рд╣реЛрд╕реНрдЯрд┐рдВрдЧ, рд╡реНрд╣реАрдкреАрдПрд╕ (VPS) рд╡реНрд╣реАрдбреАрдПрд╕ (VDS) рд╕рд░реНрд╡реНрд╣рд░реНрд╕ рдЦрд░реЗрджреА рдХрд░рд╛ | ProHoster