R ΠΏΠ°ΠΊΠ΅Ρ‚ tidyr ΠΈ Π΅Π³ΠΎ Π½ΠΎΠ²Ρ‹Π΅ Ρ„ΡƒΠ½ΠΊΡ†ΠΈΠΈ pivot_longer ΠΈ pivot_wider

ΠŸΠ°ΠΊΠ΅Ρ‚ tidyr Π²Ρ…ΠΎΠ΄ΠΈΡ‚ Π² ядро ΠΎΠ΄Π½ΠΎΠΉ ΠΈΠ· Π½Π°ΠΈΠ±ΠΎΠ»Π΅Π΅ популярных Π±ΠΈΠ±Π»ΠΈΠΎΡ‚Π΅ΠΊ Π½Π° языкС R β€” tidyverse.
ОсновноС Π½Π°Π·Π½Π°Ρ‡Π΅Π½ΠΈΠ΅ ΠΏΠ°ΠΊΠ΅Ρ‚Π° β€” ΠΏΡ€ΠΈΠ²Π΅Π΄Π΅Π½ΠΈΠ΅ Π΄Π°Π½Π½Ρ‹Ρ… ΠΊ Π°ΠΊΠΊΡƒΡ€Π°Ρ‚Π½ΠΎΠΌΡƒ Π²ΠΈΠ΄Ρƒ.

На Π₯Π°Π±Ρ€Π΅ ΡƒΠΆΠ΅ Π΅ΡΡ‚ΡŒ публикация посвящённая Π΄Π°Π½Π½ΠΎΠΌΡƒ ΠΏΠ°ΠΊΠ΅Ρ‚Ρƒ, Π½ΠΎ Π΄Π°Ρ‚ΠΈΡ€ΡƒΡŽΠ΅Ρ‚ΡΡ ΠΎΠ½Π° 2015 Π³ΠΎΠ΄ΠΎΠΌ. А я Ρ…ΠΎΡ‡Ρƒ Ρ€Π°ΡΡΠΊΠ°Π·Π°Ρ‚ΡŒ, ΠΎ Π½Π°ΠΈΠ±ΠΎΠ»Π΅Π΅ Π°ΠΊΡ‚ΡƒΠ°Π»ΡŒΠ½Ρ‹Ρ… измСнСниях, ΠΎ ΠΊΠΎΡ‚ΠΎΡ€Ρ‹Ρ… нСсколько Π΄Π½Π΅ΠΉ Π½Π°Π·Π°Π΄ сообщил Π΅Π³ΠΎ Π°Π²Ρ‚ΠΎΡ€ Π₯Π΅Π΄Π»ΠΈ Π’ΠΈΠΊΡ…Π΅ΠΌ.

R ΠΏΠ°ΠΊΠ΅Ρ‚ tidyr ΠΈ Π΅Π³ΠΎ Π½ΠΎΠ²Ρ‹Π΅ Ρ„ΡƒΠ½ΠΊΡ†ΠΈΠΈ pivot_longer ΠΈ pivot_wider

SJK: Π€ΡƒΠ½ΠΊΡ†ΠΈΠΈ gather() ΠΈ spread() Π±ΡƒΠ΄ΡƒΡ‚ ΡΡ‡ΠΈΡ‚Π°Ρ‚ΡŒΡΡ ΡƒΡΡ‚Π°Ρ€Π΅Π²ΡˆΠΈΠΌΠΈ?

Hadley Wickham: Π’ ΠΊΠ°ΠΊΠΎΠΉ Ρ‚ΠΎ ΠΌΠ΅Ρ€Π΅. ΠœΡ‹ пСрСстанСм Ρ€Π΅ΠΊΠΎΠΌΠ΅Π½Π΄ΠΎΠ²Π°Ρ‚ΡŒ использованиС Π΄Π°Π½Π½Ρ‹Ρ… Ρ„ΡƒΠ½ΠΊΡ†ΠΈΠΉ, ΠΈ ΠΈΡΠΏΡ€Π°Π²Π»ΡΡ‚ΡŒ Π² Π½ΠΈΡ… ошибки, Π½ΠΎ ΠΎΠ½ΠΈ ΠΈ Π΄Π°Π»Π΅Π΅ Π±ΡƒΠ΄Ρƒ ΠΏΡ€ΠΈΡΡƒΡ‚ΡΡ‚Π²ΠΎΠ²Π°Ρ‚ΡŒ Π² ΠΏΠ°ΠΊΠ΅Ρ‚Π΅ Π² Ρ‚Π΅ΠΊΡƒΡ‰Π΅ΠΌ состоянии.

Π‘ΠΎΠ΄Π΅Ρ€ΠΆΠ°Π½ΠΈΠ΅

Если Π²Ρ‹ ΠΈΠ½Ρ‚Π΅Ρ€Π΅ΡΡƒΠ΅Ρ‚Π΅ΡΡŒ Π°Π½Π°Π»ΠΈΠ·ΠΎΠΌ Π΄Π°Π½Π½Ρ‹Ρ… Π²ΠΎΠ·ΠΌΠΎΠΆΠ½ΠΎ Π²Π°ΠΌ Π±ΡƒΠ΄ΡƒΡ‚ интСрСсны ΠΌΠΎΠΈ telegram ΠΈ youtube ΠΊΠ°Π½Π°Π»Ρ‹. Π‘ΠΎΠ»ΡŒΡˆΠ°Ρ Ρ‡Π°ΡΡ‚ΡŒ ΠΊΠΎΠ½Ρ‚Π΅Π½Ρ‚Π° ΠΊΠΎΡ‚ΠΎΡ€Ρ‹Ρ… посвящСна языку R.

ΠšΠΎΠ½Ρ†Π΅ΠΏΡ†ΠΈΡ TidyData

ЦСль tidyr β€” ΠΏΠΎΠΌΠΎΡ‡ΡŒ Π²Π°ΠΌ привСсти Π΄Π°Π½Π½Ρ‹Π΅ ΠΊ Ρ‚Π°ΠΊ Π½Π°Π·Ρ‹Π²Π°Π΅ΠΌΠΎΠΌΡƒ Π°ΠΊΠΊΡƒΡ€Π°Ρ‚Π½ΠΎΠΌΡƒ Π²ΠΈΠ΄Ρƒ. АккуратныС Π΄Π°Π½Π½Ρ‹Π΅ β€” это Π΄Π°Π½Π½Ρ‹Π΅, Π³Π΄Π΅:

  • КаТдая пСрСмСнная находится Π² столбцС.
  • КаТдоС наблюдСниС β€” это строка.
  • КаТдоС Π·Π½Π°Ρ‡Π΅Π½ΠΈΠ΅ являСтся ячСйкой.

Π‘ Π΄Π°Π½Π½Ρ‹ΠΌΠΈ ΠΊΠΎΡ‚ΠΎΡ€Ρ‹Π΅ ΠΏΡ€ΠΈΠ²Π΅Π΄Π΅Π½Ρ‹ ΠΊ tidy data Π·Π½Π°Ρ‡ΠΈΡ‚Π΅Π»ΡŒΠ½ΠΎ ΠΏΡ€ΠΎΡ‰Π΅ ΠΈ ΡƒΠ΄ΠΎΠ±Π½Π΅Π΅ Ρ€Π°Π±ΠΎΡ‚Π°Ρ‚ΡŒ ΠΏΡ€ΠΈ ΠΏΡ€ΠΎΠ²Π΅Π΄Π΅Π½ΠΈΠΈ Π°Π½Π°Π»ΠΈΠ·Π°.

ΠžΡΠ½ΠΎΠ²Π½Ρ‹Π΅ Ρ„ΡƒΠ½ΠΊΡ†ΠΈΠΈ входящиС Π² ΠΏΠ°ΠΊΠ΅Ρ‚ tidyr

tidyr содСрТит Π½Π°Π±ΠΎΡ€ Ρ„ΡƒΠ½ΠΊΡ†ΠΈΠΈ ΠΏΡ€Π΅Π΄Π½Π°Π·Π½Π°Ρ‡Π΅Π½Π½Ρ‹Ρ… для трансформации Ρ‚Π°Π±Π»ΠΈΡ†:

  • fill() β€” Π·Π°ΠΏΠΎΠ»Π½Π΅Π½ΠΈΠ΅ ΠΏΡ€ΠΎΠΏΡƒΡ‰Π΅Π½Π½Ρ‹Ρ… Π·Π½Π°Ρ‡Π΅Π½ΠΈΠΉ Π² столбцС, ΠΏΡ€Π΅Π΄Ρ‹Π΄ΡƒΡ‰ΠΈΠΌΠΈ значСниями;
  • separate() β€” Ρ€Π°Π·Π±ΠΈΠ²Π°Π΅Ρ‚ ΠΎΠ΄Π½ΠΎ ΠΏΠΎΠ»Π΅ Π½Π° нСсколько Ρ‡Π΅Ρ€Π΅Π· Ρ€Π°Π·Π΄Π΅Π»ΠΈΡ‚Π΅Π»ΡŒ;
  • unite() β€” ΡΠΎΠ²Π΅Ρ€ΡˆΠ°Π΅Ρ‚ ΠΎΠΏΠ΅Ρ€Π°Ρ†ΠΈΡŽ объСдинСния Π½Π΅ΡΠΊΠΎΠ»ΡŒΠΊΠΈΡ… ΠΏΠΎΠ»Π΅ΠΉ Π² ΠΎΠ΄Π½ΠΎ, дСйствиС ΠΎΠ±Ρ€Π°Ρ‚Π½ΠΎΠ΅ Ρ„ΡƒΠ½ΠΊΡ†ΠΈΠΈ separate();
  • pivot_longer() β€” функция, ΠΏΡ€Π΅ΠΎΠ±Ρ€Π°Π·ΡƒΡŽΡ‰Π°Ρ Π΄Π°Π½Π½Ρ‹Π΅ ΠΈΠ· ΡˆΠΈΡ€ΠΎΠΊΠΎΠ³ΠΎ Ρ„ΠΎΡ€ΠΌΠ°Ρ‚Π° Π² Π΄Π»ΠΈΠ½Π½Ρ‹ΠΉ;
  • pivot_wider() β€” функция, ΠΏΡ€Π΅ΠΎΠ±Ρ€Π°Π·ΡƒΡŽΡ‰Π°Ρ Π΄Π°Π½Π½Ρ‹Π΅ ΠΈΠ· Π΄Π»ΠΈΠ½Π½ΠΎΠ³ΠΎ Ρ„ΠΎΡ€ΠΌΠ°Ρ‚Π° Π² ΡˆΠΈΡ€ΠΎΠΊΠΈΠΉ. ΠžΠΏΠ΅Ρ€Π°Ρ†ΠΈΡ обратная Ρ‚ΠΎΠΉ, ΠΊΠΎΡ‚ΠΎΡ€ΡƒΡŽ осущСствляСт функция pivot_longer().
  • gather()ΡƒΡΡ‚Π°Ρ€Π΅Π²ΡˆΠ°Ρ β€” функция, ΠΏΡ€Π΅ΠΎΠ±Ρ€Π°Π·ΡƒΡŽΡ‰Π°Ρ Π΄Π°Π½Π½Ρ‹Π΅ ΠΈΠ· ΡˆΠΈΡ€ΠΎΠΊΠΎΠ³ΠΎ Ρ„ΠΎΡ€ΠΌΠ°Ρ‚Π° Π² Π΄Π»ΠΈΠ½Π½Ρ‹ΠΉ;
  • spread()ΡƒΡΡ‚Π°Ρ€Π΅Π²ΡˆΠ°Ρ β€” функция, ΠΏΡ€Π΅ΠΎΠ±Ρ€Π°Π·ΡƒΡŽΡ‰Π°Ρ Π΄Π°Π½Π½Ρ‹Π΅ ΠΈΠ· Π΄Π»ΠΈΠ½Π½ΠΎΠ³ΠΎ Ρ„ΠΎΡ€ΠΌΠ°Ρ‚Π° Π² ΡˆΠΈΡ€ΠΎΠΊΠΈΠΉ. ΠžΠΏΠ΅Ρ€Π°Ρ†ΠΈΡ обратная Ρ‚ΠΎΠΉ, ΠΊΠΎΡ‚ΠΎΡ€ΡƒΡŽ осущСствляСт функция gather().

Новая концСпция прСобразования Π΄Π°Π½Π½Ρ‹Ρ… ΠΈΠ· ΡˆΠΈΡ€ΠΎΠΊΠΎΠ³ΠΎ Ρ„ΠΎΡ€ΠΌΠ°Ρ‚Π° Π² Π΄Π»ΠΈΠ½Π½Ρ‹ΠΉ ΠΈ Π½Π°ΠΎΠ±ΠΎΡ€ΠΎΡ‚

Π Π°Π½Π΅Π΅ для ΠΏΠΎΠ΄ΠΎΠ±Π½ΠΎΠ³ΠΎ Ρ€ΠΎΠ΄Π° трансформации использовались Ρ„ΡƒΠ½ΠΊΡ†ΠΈΠΈ gather() ΠΈ spread(). Π—Π° Π³ΠΎΠ΄Ρ‹ сущСствования этих Ρ„ΡƒΠ½ΠΊΡ†ΠΈΠΉ стало ΠΎΡ‡Π΅Π²ΠΈΠ΄Π½ΠΎ, Ρ‡Ρ‚ΠΎ для Π±ΠΎΠ»ΡŒΡˆΠΈΠ½ΡΡ‚Π²Π° ΠΏΠΎΠ»ΡŒΠ·ΠΎΠ²Π°Ρ‚Π΅Π»Π΅ΠΉ, Π²ΠΊΠ»ΡŽΡ‡Π°Ρ Π°Π²Ρ‚ΠΎΡ€Π° ΠΏΠ°ΠΊΠ΅Ρ‚Π°, названия этих Ρ„ΡƒΠ½ΠΊΡ†ΠΈΠΉ, ΠΈ ΠΈΡ… Π°Ρ€Π³ΡƒΠΌΠ΅Π½Ρ‚ΠΎΠ² Π±Ρ‹Π»ΠΈ достаточно Π½Π΅ ΠΎΡ‡Π΅Π²ΠΈΠ΄Π½Ρ‹, ΠΈ Π²Ρ‹Π·Ρ‹Π²Π°Π»ΠΈ слоТности ΠΏΡ€ΠΈ ΠΈΡ… поискС ΠΈ ΠΏΠΎΠ½ΠΈΠΌΠ°Π½ΠΈΠΈ Ρ‚ΠΎΠ³ΠΎ, какая ΠΈΠ· этих Ρ„ΡƒΠ½ΠΊΡ†ΠΈΠΉ ΠΏΡ€ΠΈΠ²ΠΎΠ΄ΠΈΡ‚ Π΄Π°Ρ‚Π° Ρ„Ρ€Π΅ΠΉΠΌ ΠΈΠ· ΡˆΠΈΡ€ΠΎΠΊΠΎ Π² Π΄Π»ΠΈΠ½Π½Ρ‹ΠΉ Ρ„ΠΎΡ€ΠΌΠ°Ρ‚, ΠΈ Π½Π°ΠΎΠ±ΠΎΡ€ΠΎΡ‚.

Π’ связи с Ρ‡Π΅ΠΌ Π² tidyr Π±Ρ‹Π»ΠΈ Π΄ΠΎΠ±Π°Π²Π»Π΅Π½Ρ‹ Π΄Π²Π΅ Π½ΠΎΠ²Ρ‹Π΅, Π²Π°ΠΆΠ½Ρ‹Π΅ Ρ„ΡƒΠ½ΠΊΡ†ΠΈΠΈ, ΠΊΠΎΡ‚ΠΎΡ€Ρ‹Π΅ ΠΏΡ€Π΅Π΄Π½Π°Π·Π½Π°Ρ‡Π΅Π½Ρ‹ для трансформации Π΄Π°Ρ‚Π° Ρ„Ρ€Π΅ΠΉΠΌΠΎΠ².

НовыС Ρ„ΡƒΠ½ΠΊΡ†ΠΈΠΈ pivot_longer() ΠΈ pivot_wider() Π±Ρ‹Π»ΠΈ созданы ΠΏΠΎΠ΄ Π²ΠΏΠ΅Ρ‡Π°Ρ‚Π»Π΅Π½ΠΈΠ΅ΠΌ ΠΎΡ‚ Π½Π΅ΠΊΠΎΡ‚ΠΎΡ€Ρ‹Ρ… Ρ„ΡƒΠ½ΠΊΡ†ΠΈΠΉ ΠΈΠ· ΠΏΠ°ΠΊΠ΅Ρ‚Π° cdata, созданного Π”ΠΆΠΎΠ½ΠΎΠΌ ΠœΠ°ΡƒΠ½Ρ‚ΠΎΠΌ ΠΈ Ниной Π—ΡƒΠΌΠ΅Π»ΡŒ.

Установка Π½Π°ΠΈΠ±ΠΎΠ»Π΅Π΅ Π°ΠΊΡ‚ΡƒΠ°Π»ΡŒΠ½ΠΎΠΉ вСрсии tidyr 0.8.3.9000

Для установки Π½ΠΎΠ²ΠΎΠΉ, Π½Π°ΠΈΠ±ΠΎΠ»Π΅Π΅ Π°ΠΊΡ‚ΡƒΠ°Π»ΡŒΠ½ΠΎΠΉ вСрсии ΠΏΠ°ΠΊΠ΅Ρ‚Π° tidyr 0.8.3.9000, Π² ΠΊΠΎΡ‚ΠΎΡ€ΠΎΠΉ доступны Π½ΠΎΠ²Ρ‹Π΅ Ρ„ΡƒΠ½ΠΊΡ†ΠΈΠΈ, Π²ΠΎΡΠΏΠΎΠ»ΡŒΠ·ΡƒΠΉΡ‚Π΅ΡΡŒ ΡΠ»Π΅Π΄ΡƒΡŽΡ‰ΠΈΠΌ ΠΊΠΎΠ΄ΠΎΠΌ.

devtools::install_github("tidyverse/tidyr")

На ΠΌΠΎΠΌΠ΅Π½Ρ‚ написания ΡΡ‚Π°Ρ‚ΡŒΠΈ эти Ρ„ΡƒΠ½ΠΊΡ†ΠΈΠΈ доступны Ρ‚ΠΎΠ»ΡŒΠΊΠΎ Π² dev вСрсии ΠΏΠ°ΠΊΠ΅Ρ‚Π° Π½Π° GitHub.

ΠŸΠ΅Ρ€Π΅Ρ…ΠΎΠ΄ Π½Π° Π½ΠΎΠ²Ρ‹Π΅ Ρ„ΡƒΠ½ΠΊΡ†ΠΈΠΈ

На самом Π΄Π΅Π»Π΅ пСрСвСсти старыС скрипты Π½Π° Ρ€Π°Π±ΠΎΡ‚Ρƒ с Π½ΠΎΠ²Ρ‹ΠΌΠΈ функциями нСслоТно, для большСго понимания, я Π²ΠΎΠ·ΡŒΠΌΡƒ ΠΏΡ€ΠΈΠΌΠ΅Ρ€ ΠΈΠ· Π΄ΠΎΠΊΡƒΠΌΠ΅Π½Ρ‚Π°Ρ†ΠΈΠΈ старых Ρ„ΡƒΠ½ΠΊΡ†ΠΈΠΉ ΠΈ ΠΏΠΎΠΊΠ°ΠΆΡƒ ΠΊΠ°ΠΊ эти ΠΆΠ΅ ΠΎΠΏΠ΅Ρ€Π°Ρ†ΠΈΠΈ Π²Ρ‹ΠΏΠΎΠ»Π½ΡΡŽΡ‚ΡΡ с ΠΏΠΎΠΌΠΎΡ‰ΡŒΡŽ Π½ΠΎΠ²Ρ‹Ρ… pivot_*() Ρ„ΡƒΠ½ΠΊΡ†ΠΈΠΉ.

ΠŸΡ€Π΅ΠΎΠ±Ρ€Π°Π·ΠΎΠ²Π°Π½ΠΈΠ΅ ΡˆΠΈΡ€ΠΎΠΊΠΎΠ³ΠΎ Ρ„ΠΎΡ€ΠΌΠ°Ρ‚Π° ΠΊ Π΄Π»ΠΈΠ½Π½ΠΎΠΌΡƒ.

ΠŸΡ€ΠΈΠΌΠ΅Ρ€ ΠΊΠΎΠ΄Π° ΠΈΠ· Π΄ΠΎΠΊΡƒΠΌΠ΅Π½Ρ‚Π°Ρ†ΠΈΠΈ Ρ„ΡƒΠ½ΠΊΡ†ΠΈΠΈ gather

# 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")

ΠŸΡ€Π΅ΠΎΠ±Ρ€Π°Π·ΠΎΠ²Π°Π½ΠΈΠ΅ Π΄Π»ΠΈΠ½Π½ΠΎΠ³ΠΎ Ρ„ΠΎΡ€ΠΌΠ°Ρ‚Π° ΠΊ ΡˆΠΈΡ€ΠΎΠΊΠΎΠΌΡƒ.

ΠŸΡ€ΠΈΠΌΠ΅Ρ€ ΠΊΠΎΠ΄Π° ΠΈΠ· Π΄ΠΎΠΊΡƒΠΌΠ΅Π½Ρ‚Π°Ρ†ΠΈΠΈ Ρ„ΡƒΠ½ΠΊΡ†ΠΈΠΈ spread

# 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(), Π² исходной Ρ‚Π°Π±Π»ΠΈΡ†Π΅ stocks Π½Π΅Ρ‚ столбцов пСрСчислСнных Π² Π°Ρ€Π³ΡƒΠΌΠ΅Π½Ρ‚Π°Ρ… names_to ΠΈ values_to ΠΈΡ… ΠΈΠΌΠ΅Π½Π° Π½Π΅ΠΎΠ±Ρ…ΠΎΠ΄ΠΈΠΌΠΎ ΡƒΠΊΠ°Π·Ρ‹Π²Π°Ρ‚ΡŒ Π² ΠΊΠ°Π²Ρ‹Ρ‡ΠΊΠ°Ρ….

Π’Π°Π±Π»ΠΈΡ†Π° с ΠΏΠΎΠΌΠΎΡ‰ΡŒΡŽ ΠΊΠΎΡ‚ΠΎΡ€ΠΎΠΉ Π²Π°ΠΌ Π½Π°ΠΈΠ±ΠΎΠ»Π΅Π΅ просто Π±ΡƒΠ΄Π΅Ρ‚ Ρ€Π°Π·ΠΎΠ±Ρ€Π°Ρ‚ΡŒΡΡ с Ρ‚Π΅ΠΌ, ΠΊΠ°ΠΊ ΠΏΠ΅Ρ€Π΅ΠΉΡ‚ΠΈ Π½Π° Ρ€Π°Π±ΠΎΡ‚Ρƒ с Π½ΠΎΠ²ΠΎΠΉ ΠΊΠΎΠ½Ρ†Π΅ΠΏΡ†ΠΈΠ΅ΠΉ tidyr.

R ΠΏΠ°ΠΊΠ΅Ρ‚ tidyr ΠΈ Π΅Π³ΠΎ Π½ΠΎΠ²Ρ‹Π΅ Ρ„ΡƒΠ½ΠΊΡ†ΠΈΠΈ pivot_longer ΠΈ pivot_wider

ΠŸΡ€ΠΈΠΌΠ΅Ρ‡Π°Π½ΠΈΠ΅ ΠΎΡ‚ Π°Π²Ρ‚ΠΎΡ€Π°

Π’Π΅ΡΡŒ ΠΏΡ€ΠΈΠ²Π΅Π΄Ρ‘Π½Π½Ρ‹ΠΉ Π΄Π°Π»Π΅Π΅ тСкст являСтся Π°Π΄Π°ΠΏΡ‚ΠΈΠ²Π½Ρ‹ΠΌ, я Π±Ρ‹ Π΄Π°ΠΆΠ΅ сказал свободным ΠΏΠ΅Ρ€Π΅Π²ΠΎΠ΄ΠΎΠΌ Π²ΠΈΠ½ΡŒΠ΅Ρ‚ΠΊΠΈ с ΠΎΡ„ΠΈΡ†ΠΈΠ°Π»ΡŒΠ½ΠΎΠ³ΠΎ сайта Π±ΠΈΠ±Π»ΠΈΠΎΡ‚Π΅ΠΊΠΈ tidyverse.

ΠŸΡ€ΠΎΡΡ‚ΠΎΠΉ ΠΏΡ€ΠΈΠΌΠ΅Ρ€ прСобразования Π΄Π°Π½Π½Ρ‹Ρ… ΠΈΠ· ΡˆΠΈΡ€ΠΎΠΊΠΎΠ³ΠΎ Ρ„ΠΎΡ€ΠΌΠ°Ρ‚Π° Π² Π΄Π»ΠΈΠ½Π½Ρ‹ΠΉ

pivot_longer () β€” Π΄Π΅Π»Π°Π΅Ρ‚ Π½Π°Π±ΠΎΡ€Ρ‹ Π΄Π°Π½Π½Ρ‹Ρ… Π΄Π»ΠΈΠ½Π½Π΅Π΅, ΡƒΠΌΠ΅Π½ΡŒΡˆΠ°Ρ количСство столбцов ΠΈ увСличивая количСство строк.

R ΠΏΠ°ΠΊΠ΅Ρ‚ tidyr ΠΈ Π΅Π³ΠΎ Π½ΠΎΠ²Ρ‹Π΅ Ρ„ΡƒΠ½ΠΊΡ†ΠΈΠΈ pivot_longer ΠΈ pivot_wider

Для выполнСния ΠΏΡ€ΠΈΠΌΠ΅Ρ€ΠΎΠ², прСдставлСнных Π² ΡΡ‚Π°Ρ‚ΡŒΠ΅ ΠΈΠ·Π½Π°Ρ‡Π°Π»ΡŒΠ½ΠΎ Π½Π΅ΠΎΠ±Ρ…ΠΎΠ΄ΠΈΠΌΠΎ ΠΏΠΎΠ΄ΠΊΠ»ΡŽΡ‡ΠΈΡ‚ΡŒ Π½ΡƒΠΆΠ½Ρ‹Π΅ ΠΏΠ°ΠΊΠ΅Ρ‚Ρ‹:

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

Допустим Ρƒ нас Π΅ΡΡ‚ΡŒ Ρ‚Π°Π±Π»ΠΈΡ†Π° c Ρ€Π΅Π·ΡƒΠ»ΡŒΡ‚Π°Ρ‚Π°ΠΌΠΈ опроса, Π² ΠΊΠΎΡ‚ΠΎΡ€ΠΎΠΌ (срСди ΠΏΡ€ΠΎΡ‡Π΅Π³ΠΎ) ΡΠΏΡ€Π°ΡˆΠΈΠ²Π°Π»ΠΈ людСй ΠΎΠ± ΠΈΡ… Ρ€Π΅Π»ΠΈΠ³ΠΈΠΈ ΠΈ Π³ΠΎΠ΄ΠΎΠ²ΠΎΠΌ Π΄ΠΎΡ…ΠΎΠ΄Π΅:

#> # 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()

  • ΠŸΠ΅Ρ€Π²Ρ‹ΠΉ Π°Ρ€Π³ΡƒΠΌΠ΅Π½Ρ‚ cols, описываСт, ΠΊΠ°ΠΊΠΈΠ΅ столбцы Π½Π΅ΠΎΠ±Ρ…ΠΎΠ΄ΠΈΠΌΠΎ ΠΎΠ±ΡŠΠ΅Π΄Π΅Π½ΠΈΡ‚ΡŒ. Π’ Π΄Π°Π½Π½ΠΎΠΌ случаС всС столбцы, ΠΊΡ€ΠΎΠΌΠ΅ time.
  • АргумСнт names_to Π΄Π°Π΅Ρ‚ имя ΠΏΠ΅Ρ€Π΅ΠΌΠ΅Π½Π½ΠΎΠΉ, которая Π±ΡƒΠ΄Π΅Ρ‚ создана ΠΈΠ· ΠΈΠΌΡ‘Π½ столбцов, ΠΊΠΎΡ‚ΠΎΡ€Ρ‹Π΅ ΠΌΡ‹ объСдинили.
  • values_to Π΄Π°Π΅Ρ‚ имя ΠΏΠ΅Ρ€Π΅ΠΌΠ΅Π½Π½ΠΎΠΉ, которая Π±ΡƒΠ΄Π΅Ρ‚ создана ΠΈΠ· Π΄Π°Π½Π½Ρ‹Ρ…, хранящихся Π² значСниях ячССк ΠΎΠ±ΡŠΠ΅Π΄ΠΈΠ½Ρ‘Π½Π½Ρ‹Ρ… столбцов.

Π‘ΠΏΠ΅Ρ†ΠΈΡ„ΠΈΠΊΠ°Ρ†ΠΈΠΈ

Π­Ρ‚ΠΎ Π½ΠΎΠ²Ρ‹ΠΉ Ρ„ΡƒΠ½ΠΊΡ†ΠΈΠΎΠ½Π°Π» ΠΏΠ°ΠΊΠ΅Ρ‚Π° tidyr, ΠΊΠΎΡ‚ΠΎΡ€Ρ‹ΠΉ Ρ€Π°Π½Π΅Π΅ ΠΏΡ€ΠΈ Ρ€Π°Π±ΠΎΡ‚Π΅ с ΡƒΡΡ‚Π°Ρ€Π΅Π²ΡˆΠΈΠΌΠΈ функциями Π±Ρ‹Π» нСдоступСн.

БпСцификация β€” это Ρ„Ρ€Π΅ΠΉΠΌ Π΄Π°Π½Π½Ρ‹Ρ…, каТдая строка ΠΊΠΎΡ‚ΠΎΡ€ΠΎΠ³ΠΎ соотвСтствуСт ΠΎΠ΄Π½ΠΎΠΌΡƒ столбцу Π² Π½ΠΎΠ²ΠΎΠΌ Π²Ρ‹Ρ…ΠΎΠ΄Π½ΠΎΠΌ Π΄Π°Ρ‚Π° Ρ„Ρ€Π΅ΠΉΠΌΠ΅, ΠΈ двумя ΡΠΏΠ΅Ρ†ΠΈΠ°Π»ΡŒΠ½Ρ‹ΠΌΠΈ столбцами, ΠΊΠΎΡ‚ΠΎΡ€Ρ‹Π΅ Π½Π°Ρ‡ΠΈΠ½Π°ΡŽΡ‚ΡΡ с.:

  • .name содСрТит исходноС Π½Π°Π·Π²Π°Π½ΠΈΠ΅ столбца.
  • .value содСрТит имя столбца, Π² ΠΊΠΎΡ‚ΠΎΡ€Ρ‹ΠΉ Π±ΡƒΠ΄ΡƒΡ‚ Π²Ρ…ΠΎΠ΄ΠΈΡ‚ΡŒ значСния ячССк.

ΠžΡΡ‚Π°Π»ΡŒΠ½Ρ‹Π΅ столбцы спСцификации ΠΎΡ‚Ρ€Π°ΠΆΠ°ΡŽΡ‚ Ρ‚ΠΎ, ΠΊΠ°ΠΊ Π² Π½ΠΎΠ²ΠΎΠΌ столбцС Π±ΡƒΠ΄Π΅Ρ‚ Π²Ρ‹Π²ΠΎΠ΄ΠΈΡ‚ΡŒΡΡ Π½Π°Π·Π²Π°Π½ΠΈΠ΅ сТимаСмых столбцов ΠΈΠ· .name.

БпСцификация описываСт ΠΌΠ΅Ρ‚Π°Π΄Π°Π½Π½Ρ‹Π΅, хранящиСся Π² ΠΈΠΌΠ΅Π½ΠΈ столбца, с ΠΎΠ΄Π½ΠΎΠΉ строкой для ΠΊΠ°ΠΆΠ΄ΠΎΠ³ΠΎ столбца ΠΈ ΠΎΠ΄Π½ΠΈΠΌ столбцом для ΠΊΠ°ΠΆΠ΄ΠΎΠΉ ΠΏΠ΅Ρ€Π΅ΠΌΠ΅Π½Π½ΠΎΠΉ, объСдинСнной с ΠΈΠΌΠ΅Π½Π΅ΠΌ столбца, Π½Π°Π²Π΅Ρ€Π½ΠΎΠ΅ сСйчас Ρ‚Π°ΠΊΠΎΠ΅ ΠΎΠΏΡ€Π΅Π΄Π΅Π»Π΅Π½ΠΈΠ΅ каТСтся Π·Π°ΠΏΡƒΡ‚Π°Π½Π½Ρ‹ΠΌ, Π½ΠΎ послС рассмотрСния Π½Π΅ΡΠΊΠΎΠ»ΡŒΠΊΠΈΡ… ΠΏΡ€ΠΈΠΌΠ΅Ρ€ΠΎΠ² всё станСт Π·Π½Π°Ρ‡ΠΈΡ‚Π΅Π»ΡŒΠ½ΠΎ понятнСС.

Бмысл спСцификации Π·Π°ΠΊΠ»ΡŽΡ‡Π°Π΅Ρ‚ΡΡ Π² Ρ‚ΠΎΠΌ, Ρ‡Ρ‚ΠΎ Π²Ρ‹ ΠΌΠΎΠΆΠ΅Ρ‚Π΅ ΠΈΠ·Π²Π»Π΅ΠΊΠ°Ρ‚ΡŒ, ΠΈΠ·ΠΌΠ΅Π½ΡΡ‚ΡŒ ΠΈ Π·Π°Π΄Π°Π²Π°Ρ‚ΡŒ Π½ΠΎΠ²Ρ‹Π΅ ΠΌΠ΅Ρ‚Π°Π΄Π°Π½Π½Ρ‹Π΅ ΠΊ ΠΏΡ€Π΅ΠΎΠ±Ρ€Π°Π·ΡƒΠ΅ΠΌΠΎΠΌΡƒ Π΄Π°Ρ‚Π°Ρ„Ρ€Π΅ΠΉΠΌΡƒ.

Для Ρ€Π°Π±ΠΎΡ‚Ρ‹ со спСцификациями ΠΏΡ€ΠΈ ΠΏΡ€Π΅ΠΎΠ±Ρ€Π°Π·ΠΎΠ²Π°Π½ΠΈΠΈ Ρ‚Π°Π±Π»ΠΈΡ†Ρ‹ ΠΈΠ· ΡˆΠΈΡ€ΠΎΠΊΠΎΠ³ΠΎ Ρ„ΠΎΡ€ΠΌΠ°Ρ‚Π° Π² Π΄Π»ΠΈΠ½Π½Ρ‹ΠΉ слуТит функция pivot_longer_spec().

Как эта функция Ρ€Π°Π±ΠΎΡ‚Π°Π΅Ρ‚, ΠΎΠ½Π° Π±Π΅Ρ€Ρ‘Ρ‚ любой Π΄Π°Ρ‚Π° Ρ„Ρ€Π΅ΠΉΠΌ, ΠΈ Ρ„ΠΎΡ€ΠΌΠΈΡ€ΡƒΠ΅Ρ‚ Π΅Π³ΠΎ ΠΌΠ΅Ρ‚Π°Π΄Π°Π½Π½Ρ‹Π΅ описанным Π²Ρ‹ΡˆΠ΅ ΠΎΠ±Ρ€Π°Π·ΠΎΠΌ.

Для ΠΏΡ€ΠΈΠΌΠ΅Ρ€Π° Π΄Π°Π²Π°ΠΉΡ‚Π΅ Π²ΠΎΠ·ΠΌΡ‘ΠΌ Π½Π°Π±ΠΎΡ€ Π΄Π°Π½Π½Ρ‹Ρ… who, ΠΊΠΎΡ‚ΠΎΡ€Ρ‹ΠΉ прСдоставляСтся вмСстС с ΠΏΠ°ΠΊΠ΅Ρ‚ΠΎΠΌ tidyr. Π­Ρ‚ΠΎΡ‚ Π½Π°Π±ΠΎΡ€ Π΄Π°Π½Π½Ρ‹Ρ… содСрТит ΠΈΠ½Ρ„ΠΎΡ€ΠΌΠ°Ρ†ΠΈΡŽ ΠΏΡ€Π΅Π΄ΠΎΡΡ‚Π°Π²Π»ΡΠ΅ΠΌΡƒΡŽ ΠΌΠ΅ΠΆΠ΄ΡƒΠ½Π°Ρ€ΠΎΠ΄Π½ΠΎΠΉ ΠΎΡ€Π³Π°Π½ΠΈΠ·Π°Ρ†ΠΈΠ΅ΠΉ здравоохранСния ΠΎ заболСваСмости Ρ‚ΡƒΠ±Π΅Ρ€ΠΊΡƒΠ»Ρ‘Π·ΠΎΠΌ.

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

Поля country, iso2, iso3 ΡƒΠΆΠ΅ ΡΠ²Π»ΡΡŽΡ‚ΡΡ ΠΏΠ΅Ρ€Π΅ΠΌΠ΅Π½Π½Ρ‹ΠΌΠΈ. Наша Π·Π°Π΄Π°Ρ‡Π° ΠΏΠ΅Ρ€Π΅Π²Π΅Ρ€Π½ΡƒΡ‚ΡŒ столбцы с 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

ΠžΠ±Ρ€Π°Ρ‚ΠΈΡ‚Π΅ Π²Π½ΠΈΠΌΠ°Π½ΠΈΠ΅, столбСц .name Π΄ΠΎΠ»ΠΆΠ΅Π½ ΠΎΡΡ‚Π°Π²Π°Ρ‚ΡŒΡΡ Π½Π΅ΠΈΠ·ΠΌΠ΅Π½Π½Ρ‹ΠΌ, Ρ‚Π°ΠΊ ΠΊΠ°ΠΊ это наш индСкс Π² ΠΈΠΌΠ΅Π½Π°Ρ… столбцов исходного Π½Π°Π±ΠΎΡ€Π° Π΄Π°Π½Π½Ρ‹Ρ….

Пол ΠΈ возраст (столбцы gender ΠΈ age) ΠΈΠΌΠ΅ΡŽΡ‚ фиксированныС ΠΈ извСстныС значСния, поэтому рСкомСндуСтся ΠΏΡ€Π΅ΠΎΠ±Ρ€Π°Π·ΠΎΠ²Ρ‹Π²Π°Ρ‚ΡŒ эти столбцы Π² Ρ„Π°ΠΊΡ‚ΠΎΡ€Ρ‹:

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

НаконСц для Ρ‚ΠΎΠ³ΠΎ, Ρ‡Ρ‚ΠΎΠ±Ρ‹ ΠΏΡ€ΠΈΠΌΠ΅Π½ΠΈΡ‚ΡŒ ΡΠΎΠ·Π΄Π°Π½Π½ΡƒΡŽ Π½Π°ΠΌΠΈ ΡΠΏΠ΅Ρ†ΠΈΡ„ΠΈΠΊΠ°Ρ†ΠΈΡŽ ΠΊ исходному Π΄Π°Ρ‚Π° Ρ„Ρ€Π΅ΠΉΠΌΡƒ who Π½Π°ΠΌ Π½Π΅ΠΎΠ±Ρ…ΠΎΠ΄ΠΈΠΌΠΎ ΠΈΡΠΏΠΎΠ»ΡŒΠ·ΠΎΠ²Π°Ρ‚ΡŒ Π°Ρ€Π³ΡƒΠΌΠ΅Π½Ρ‚ spec Π² Ρ„ΡƒΠ½ΠΊΡ†ΠΈΠΈ 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

Всё, Ρ‡Ρ‚ΠΎ ΠΌΡ‹ Ρ‚ΠΎΠ»ΡŒΠΊΠΎ Ρ‡Ρ‚ΠΎ сдСлали, схСматично ΠΌΠΎΠΆΠ½ΠΎ ΠΈΠ·ΠΎΠ±Ρ€Π°Π·ΠΈΡ‚ΡŒ ΡΠ»Π΅Π΄ΡƒΡŽΡ‰ΠΈΠΌ ΠΎΠ±Ρ€Π°Π·ΠΎΠΌ:

R ΠΏΠ°ΠΊΠ΅Ρ‚ tidyr ΠΈ Π΅Π³ΠΎ Π½ΠΎΠ²Ρ‹Π΅ Ρ„ΡƒΠ½ΠΊΡ†ΠΈΠΈ pivot_longer ΠΈ pivot_wider

БпСцификация с использованиСм Π½Π΅ΡΠΊΠΎΠ»ΡŒΠΊΠΈΡ… Π·Π½Π°Ρ‡Π΅Π½ΠΈΠΉ(.value)

Π’ ΠΏΡ€ΠΈΠ²Π΅Π΄Ρ‘Π½Π½ΠΎΠΌ Π²Ρ‹ΡˆΠ΅ ΠΏΡ€ΠΈΠΌΠ΅Ρ€Π΅ столбСц спСцификации .value содСрТал Ρ‚ΠΎΠ»ΡŒΠΊΠΎ ΠΎΠ΄Π½ΠΎ Π·Π½Π°Ρ‡Π΅Π½ΠΈΠ΅, Π² Π±ΠΎΠ»ΡŒΡˆΠΈΠ½ΡΡ‚Π²Π΅ случаСв это Ρ‚Π°ΠΊ ΠΈ Π±Ρ‹Π²Π°Π΅Ρ‚.

Но ΠΈΠ·Ρ€Π΅Π΄ΠΊΠ° ΠΌΠΎΠΆΠ΅Ρ‚ Π²ΠΎΠ·Π½ΠΈΠΊΠ½ΡƒΡ‚ΡŒ ситуация, ΠΊΠΎΠ³Π΄Π° Π²Π°ΠΌ Π½Π΅ΠΎΠ±Ρ…ΠΎΠ΄ΠΈΠΌΠΎ ΡΠΎΠ±Ρ€Π°Ρ‚ΡŒ Π² значСниях Π΄Π°Π½Π½Ρ‹Π΅ ΠΈΠ· столбцов с Ρ€Π°Π·Π½Ρ‹ΠΌΠΈ Ρ‚ΠΈΠΏΠ°ΠΌΠΈ Π΄Π°Π½Π½Ρ‹Ρ…. Π‘ ΠΏΠΎΠΌΠΎΡ‰ΡŒΡŽ ΡƒΡΡ‚Π°Ρ€Π΅Π²ΡˆΠ΅ΠΉ Ρ„ΡƒΠ½ΠΊΡ†ΠΈΠΈ spread() это Π±Ρ‹Π»ΠΎ Π±Ρ‹ ΡΠ΄Π΅Π»Π°Ρ‚ΡŒ довольно слоТно.

ΠŸΡ€ΠΈΠ²Π΅Π΄Ρ‘Π½Π½Ρ‹ΠΉ Π½ΠΈΠΆΠ΅ ΠΏΡ€ΠΈΠΌΠ΅Ρ€ заимствован ΠΈΠ· Π²ΠΈΠ½ΡŒΠ΅Ρ‚ΠΊΠΈ ΠΊ ΠΏΠ°ΠΊΠ΅Ρ‚Ρƒ data.table.

Π”Π°Π²Π°ΠΉΡ‚Π΅ создадим Ρ‚Ρ€Π΅Π½ΠΈΡ€ΠΎΠ²Π°Ρ‡Π½Ρ‹ΠΉ Π΄Π°Ρ‚Π°Ρ„Ρ€Π΅ΠΉΠΌ.

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

Π‘ΠΎΠ·Π΄Π°Π½Π½Ρ‹ΠΉ Π΄Π°Ρ‚Π° Ρ„Ρ€Π΅ΠΉΠΌ Π² ΠΊΠ°ΠΆΠ΄ΠΎΠΉ строкС содСрТит Π΄Π°Π½Π½Ρ‹Π΅ ΠΎ дСтях ΠΎΠ΄Π½ΠΎΠΉ сСмьи. Π’ ΡΠ΅ΠΌΡŒΡΡ… ΠΌΠΎΠΆΠ΅Ρ‚ Π±Ρ‹Ρ‚ΡŒ ΠΎΠ΄ΠΈΠ½ ΠΈΠ»ΠΈ Π΄Π²Π° Ρ€Π΅Π±Ρ‘Π½ΠΊΠ°. По ΠΊΠ°ΠΆΠ΄ΠΎΠΌΡƒ Ρ€Π΅Π±Ρ‘Π½ΠΊΡƒ прСдоставляСтся Π΄Π°Π½Π½Ρ‹Π΅ ΠΎ Π΄Π°Ρ‚Π΅ роТдСния ΠΈ ΠΏΠΎΠ»Π΅, ΠΏΡ€ΠΈΡ‡Ρ‘ΠΌ Π΄Π°Π½Π½Ρ‹Π΅ ΠΏΠΎ ΠΊΠ°ΠΆΠ΄ΠΎΠΌΡƒ Ρ€Π΅Π±Ρ‘Π½ΠΊΡƒ ΠΈΠ΄ΡƒΡ‚ Π² ΠΎΡ‚Π΄Π΅Π»ΡŒΠ½Ρ‹Ρ… столбцах, наша Π·Π°Π΄Π°Ρ‡Π° привСсти эти Π΄Π°Π½Π½Ρ‹Π΅ ΠΊ ΠΏΡ€Π°Π²ΠΈΠ»ΡŒΠ½ΠΎΠΌΡƒ для Π°Π½Π°Π»ΠΈΠ·Π° Ρ„ΠΎΡ€ΠΌΠ°Ρ‚Ρƒ.

ΠžΠ±Ρ€Π°Ρ‚ΠΈΡ‚Π΅ Π²Π½ΠΈΠΌΠ°Π½ΠΈΠ΅, Ρ‡Ρ‚ΠΎ Ρƒ нас Π΅ΡΡ‚ΡŒ Π΄Π²Π΅ ΠΏΠ΅Ρ€Π΅ΠΌΠ΅Π½Π½Ρ‹Π΅ с ΠΈΠ½Ρ„ΠΎΡ€ΠΌΠ°Ρ†ΠΈΠ΅ΠΉ ΠΎ ΠΊΠ°ΠΆΠ΄ΠΎΠΌ Ρ€Π΅Π±Π΅Π½ΠΊΠ΅: Π΅Π³ΠΎ ΠΏΠΎΠ» ΠΈ Π΄Π°Ρ‚Π° роТдСния (столбцы с прСфиксом dop содСрТат Π΄Π°Ρ‚Ρƒ роТдСния, столбцы с прСфиксом gender содСрТат ΠΏΠΎΠ» Ρ€Π΅Π±Ρ‘Π½ΠΊΠ°). Π’ ΠΎΠΆΠΈΠ΄Π°Π΅ΠΌΠΎΠΌ Ρ€Π΅Π·ΡƒΠ»ΡŒΡ‚Π°Ρ‚Π΅ ΠΎΠ½ΠΈ Π΄ΠΎΠ»ΠΆΠ½Ρ‹ ΠΈΠ΄Ρ‚ΠΈ Π² ΠΎΡ‚Π΄Π΅Π»ΡŒΠ½Ρ‹Ρ… столбцах. ΠœΡ‹ ΠΌΠΎΠΆΠ΅ΠΌ ΡΠ΄Π΅Π»Π°Ρ‚ΡŒ это, гСнСрируя ΡΠΏΠ΅Ρ†ΠΈΡ„ΠΈΠΊΠ°Ρ†ΠΈΡŽ, Π² ΠΊΠΎΡ‚ΠΎΡ€ΠΎΠΉ столбСц .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) β€” создаём ΡΠΏΠ΅Ρ†ΠΈΡ„ΠΈΠΊΠ°Ρ†ΠΈΡŽ, которая сТимаСт всС ΠΈΠΌΠ΅ΡŽΡ‰ΠΈΠ΅ΡΡ столбцы, ΠΊΡ€ΠΎΠΌΠ΅ столбца family.
  • separate(col = name, into = c(".value", "child")) β€” раздСляСм столбСц .name, ΠΊΠΎΡ‚ΠΎΡ€Ρ‹ΠΉ содСрТит ΠΈΠΌΠ΅Π½Π° исходных ΠΏΠΎΠ»Π΅ΠΉ, ΠΏΠΎ Π½ΠΈΠΆΠ½Π΅ΠΌΡƒ ΠΏΠΎΠ΄Ρ‡Ρ‘Ρ€ΠΊΠΈΠ²Π°Π½ΠΈΡŽ ΠΈ заносим ΠΏΠΎΠ»ΡƒΡ‡Π΅Π½Π½Ρ‹Π΅ значСния Π² столбцы .value ΠΈ child.
  • mutate(child = parse_number(child)) β€” ΠΏΡ€Π΅ΠΎΠ±Ρ€Π°Π·ΡƒΠ΅ΠΌ значСния поля 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() β€” являСтся ΠΎΠ±Ρ€Π°Ρ‚Π½Ρ‹ΠΌ ΠΏΡ€Π΅ΠΎΠ±Ρ€Π°Π·ΠΎΠ²Π°Π½ΠΈΠ΅ΠΌ, ΠΈ Π½Π°ΠΎΠ±ΠΎΡ€ΠΎΡ‚ ΡƒΠ²Π΅Π»ΠΈΡ‡ΠΈΠ²Π°Π΅Ρ‚ количСство столбцов Π΄Π°Ρ‚Π° Ρ„Ρ€Π΅ΠΉΠΌΠ° Π·Π° счёт ΡƒΠΌΠ΅Π½ΡŒΡˆΠ΅Π½ΠΈΡ количСства строк.

R ΠΏΠ°ΠΊΠ΅Ρ‚ 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() ΠΌΡ‹ Π±ΡƒΠ΄Π΅ΠΌ ΠΈΡΠΏΠΎΠ»ΡŒΠ·ΠΎΠ²Π°Ρ‚ΡŒ Π½Π°Π±ΠΎΡ€ Π΄Π°Π½Π½Ρ‹Ρ… fish_encounters, Π² ΠΊΠΎΡ‚ΠΎΡ€ΠΎΠΌ хранится информация ΠΎ Ρ‚ΠΎΠΌ, ΠΊΠ°ΠΊ Ρ€Π°Π·Π»ΠΈΡ‡Π½Ρ‹Π΅ станции Ρ„ΠΈΠΊΡΠΈΡ€ΡƒΡŽΡ‚ ΠΏΠ΅Ρ€Π΅Π΄Π²ΠΈΠΆΠ΅Π½ΠΈΠ΅ Ρ€Ρ‹Π± ΠΏΠΎ Ρ€Π΅ΠΊΠ΅.

#> # 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

Наша Π·Π°Π΄Π°Ρ‡Π° Ρ€Π°ΡΡˆΠΈΡ€ΠΈΡ‚ΡŒ Π΄Π°Ρ‚Π° Ρ„Ρ€Π΅ΠΉΠΌ Ρ‚Π°ΠΊ, Ρ‡Ρ‚ΠΎ Π±Ρ‹ ΠΎΠ΄ΠΈΠ½ столбСц содСрТал Π΄Π°Π½Π½Ρ‹Π΅ ΠΏΠΎ ΠΊΠ°ΠΆΠ΄ΠΎΠΉ ΠΊΠΎΠΌΠ±ΠΈΠ½Π°Ρ†ΠΈΠΈ ΠΏΡ€ΠΎΠ΄ΡƒΠΊΡ‚Π° ΠΈ страны. Для этого достаточно ΠΏΠ΅Ρ€Π΅Π΄Π°Ρ‚ΡŒ Π² Π°Ρ€Π³ΡƒΠΌΠ΅Π½Ρ‚ names_from Π²Π΅ΠΊΡ‚ΠΎΡ€, содСрТащий названия ΠΎΠ±ΡŠΠ΅Π΄ΠΈΠ½ΡΠ΅ΠΌΡ‹Ρ… ΠΏΠΎΠ»Π΅ΠΉ.

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(): ΡΠΎΠ·Π΄Π°ΡŽΡ‚ΡΡ столбцы, ΡƒΠΊΠ°Π·Π°Π½Π½Ρ‹Π΅ Π² .name, ΠΈΡΠΏΠΎΠ»ΡŒΠ·ΡƒΡ значСния ΠΈΠ· .value ΠΈ Π΄Ρ€ΡƒΠ³ΠΈΡ… столбцов.

Для этого Π½Π°Π±ΠΎΡ€Π° Π΄Π°Π½Π½Ρ‹Ρ… Π²Ρ‹ ΠΌΠΎΠΆΠ΅Ρ‚Π΅ ΡΠ³Π΅Π½Π΅Ρ€ΠΈΡ€ΠΎΠ²Π°Ρ‚ΡŒ ΠΏΠΎΠ»ΡŒΠ·ΠΎΠ²Π°Ρ‚Π΅Π»ΡŒΡΠΊΡƒΡŽ ΡΠΏΠ΅Ρ†ΠΈΡ„ΠΈΠΊΠ°Ρ†ΠΈΡŽ, Ссли Ρ…ΠΎΡ‚ΠΈΡ‚Π΅, Ρ‡Ρ‚ΠΎΠ±Ρ‹ каТдая возмоТная комбинация страны ΠΈ ΠΏΡ€ΠΎΠ΄ΡƒΠΊΡ‚Π° ΠΈΠΌΠ΅Π»Π° собствСнный столбСц, Π° Π½Π΅ Ρ‚ΠΎΠ»ΡŒΠΊΠΎ Ρ‚Π΅, ΠΊΠΎΡ‚ΠΎΡ€Ρ‹Π΅ ΠΏΡ€ΠΈΡΡƒΡ‚ΡΡ‚Π²ΡƒΡŽΡ‚ Π² Π΄Π°Π½Π½Ρ‹Ρ…:

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

ΠŸΡ€ΠΈΠ²Π΅Π΄Π΅Π½ΠΈΠ΅ Π΄Π°Π½Π½Ρ‹Ρ… ΠΊ Π°ΠΊΠΊΡƒΡ€Π°Ρ‚Π½ΠΎΠΌΡƒ Π²ΠΈΠ΄Ρƒ Π½Π° ΠΏΡ€ΠΈΠΌΠ΅Ρ€Π΅ Π½Π°Π±ΠΎΡ€Π° Π΄Π°Π½Π½Ρ‹Ρ… ΠΎ пСрСписи Π΄ΠΎΡ…ΠΎΠ΄Π° ΠΈ Π°Ρ€Π΅Π½Π΄Π½ΠΎΠΉ ΠΏΠ»Π°Ρ‚Ρ‹ Π² БША

Набор Π΄Π°Π½Π½Ρ‹Ρ… us_rent_income содСрТит ΠΈΠ½Ρ„ΠΎΡ€ΠΌΠ°Ρ†ΠΈΡŽ ΠΎ срСднСм Π΄ΠΎΡ…ΠΎΠ΄Π΅ ΠΈ Π°Ρ€Π΅Π½Π΄Π½ΠΎΠΉ ΠΏΠ»Π°Ρ‚Π΅ для ΠΊΠ°ΠΆΠ΄ΠΎΠ³ΠΎ ΡˆΡ‚Π°Ρ‚Π° Π² БША Π·Π° 2017 Π³ΠΎΠ΄ (Π½Π°Π±ΠΎΡ€ Π΄Π°Π½Π½Ρ‹Ρ… доступСн Π² ΠΏΠ°ΠΊΠ΅Ρ‚Π΅ tidycensus).

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

Π’ Ρ‚ΠΎΠΌ Π²ΠΈΠ΄Π΅, Π² ΠΊΠΎΡ‚ΠΎΡ€ΠΎΠΌ хранятся Π΄Π°Π½Π½Ρ‹Π΅ Π² датасСтС us_rent_income Ρ€Π°Π±ΠΎΡ‚Π°Ρ‚ΡŒ с Π½ΠΈΠΌΠΈ ΠΊΡ€Π°ΠΉΠ½Π΅ Π½Π΅ΡƒΠ΄ΠΎΠ±Π½ΠΎ, поэтому ΠΌΡ‹ Ρ…ΠΎΡ‚Π΅Π»ΠΈ Π±Ρ‹ ΡΠΎΠ·Π΄Π°Ρ‚ΡŒ Π½Π°Π±ΠΎΡ€ Π΄Π°Π½Π½Ρ‹Ρ… со столбцами: rent, rent_moe, come, income_moe. БущСствуСт мноТСство способов создания этой спСцификации, Π½ΠΎ Π³Π»Π°Π²Π½ΠΎΠ΅ Π² Ρ‚ΠΎΠΌ, Ρ‡Ρ‚ΠΎ Π½Π°ΠΌ Π½ΡƒΠΆΠ½ΠΎ ΡΠ³Π΅Π½Π΅Ρ€ΠΈΡ€ΠΎΠ²Π°Ρ‚ΡŒ ΠΊΠ°ΠΆΠ΄ΡƒΡŽ ΠΊΠΎΠΌΠ±ΠΈΠ½Π°Ρ†ΠΈΡŽ Π·Π½Π°Ρ‡Π΅Π½ΠΈΠΉ ΠΏΠ΅Ρ€Π΅ΠΌΠ΅Π½Π½ΠΎΠΉ ΠΈ estimate/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

Π‘Π»Π΅Π΄ΡƒΡŽΡ‰ΠΈΠΉ шаг β€” Ρ€Π°ΡΡΠΌΠΎΡ‚Ρ€Π΅Ρ‚ΡŒ ΠΏΠ΅Ρ€Π΅ΠΌΠ΅Π½Π½ΡƒΡŽ indicator.
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. * Ρ‚ΠΎΠΆΠ΅ самоС, Π½ΠΎ Ρ‚ΠΎΠ»ΡŒΠΊΠΎ для городской мСстности. Π”Π°Π²Π°ΠΉΡ‚Π΅ Ρ€Π°Π·Π΄Π΅Π»ΠΈΠΌ эти значСния Π½Π° Π΄Π²Π΅ ΠΏΠ΅Ρ€Π΅ΠΌΠ΅Π½Π½Ρ‹Π΅: area β€” ΠΌΠ΅ΡΡ‚Π½ΠΎΡΡ‚ΡŒ (total ΠΈΠ»ΠΈ urban) ΠΈ ΠΏΠ΅Ρ€Π΅ΠΌΠ΅Π½Π½ΡƒΡŽ ΡΠΎΠ΄Π΅Ρ€ΠΆΠ°Ρ‰ΡƒΡŽ фактичСскиС Π΄Π°Π½Π½Ρ‹Π΅ (population ΠΈΠ»ΠΈ growth):

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

Π’Π΅ΠΏΠ΅Ρ€ΡŒ Π½Π°ΠΌ остаётся Ρ‚ΠΎΠ»ΡŒΠΊΠΎ Ρ€Π°Π·Π΄Π΅Π»ΠΈΡ‚ΡŒ ΠΏΠ΅Ρ€Π΅ΠΌΠ΅Π½Π½ΡƒΡŽ variable Π½Π° Π΄Π²Π° столбца:

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", "[email protected]",
  "name", "Huxley Ratcliffe"
)

ΠŸΡ€ΠΈΠ²Π΅ΡΡ‚ΠΈ этот список ΠΊ Ρ‚Π°Π±Π»ΠΈΡ‡Π½ΠΎΠΌΡƒ Π²ΠΈΠ΄Ρƒ достаточно слоТно, ΠΏΠΎΡ‚ΠΎΠΌΡƒ Ρ‡Ρ‚ΠΎ Π½Π΅Ρ‚ ΠΏΠ΅Ρ€Π΅ΠΌΠ΅Π½Π½ΠΎΠΉ, которая Π±Ρ‹ ΠΈΠ΄Π΅Π½Ρ‚ΠΈΡ„ΠΈΡ†ΠΈΡ€ΠΎΠ²Π°Π»Π°, ΠΊΠ°ΠΊΠΈΠ΅ Π΄Π°Π½Π½Ρ‹Π΅ ΠΏΡ€ΠΈΠ½Π°Π΄Π»Π΅ΠΆΠ°Ρ‚ ΠΊΠ°ΠΊΠΎΠΌΡƒ ΠΊΠΎΠ½Ρ‚Π°ΠΊΡ‚Ρƒ. ΠœΡ‹ ΠΌΠΎΠΆΠ΅ΠΌ ΠΈΡΠΏΡ€Π°Π²ΠΈΡ‚ΡŒ это, Π·Π°ΠΌΠ΅Ρ‚ΠΈΠ², Ρ‡Ρ‚ΠΎ Π΄Π°Π½Π½Ρ‹Π΅ ΠΏΠΎ ΠΊΠ°ΠΆΠ΄ΠΎΠΌΡƒ Π½ΠΎΠ²ΠΎΠΌΡƒ ΠΊΠΎΠ½Ρ‚Π°ΠΊΡ‚Ρƒ Π½Π°Ρ‡ΠΈΠ½Π°ΡŽΡ‚ΡΡ с ΠΈΠΌΠ΅Π½ΠΈ ("name"), поэтому ΠΌΡ‹ ΠΌΠΎΠΆΠ΅ΠΌ ΡΠΎΠ·Π΄Π°Ρ‚ΡŒ ΡƒΠ½ΠΈΠΊΠ°Π»ΡŒΠ½Ρ‹ΠΉ ΠΈΠ΄Π΅Π½Ρ‚ΠΈΡ„ΠΈΠΊΠ°Ρ‚ΠΎΡ€, ΠΈ ΡƒΠ²Π΅Π»ΠΈΡ‡ΠΈΠ²Π°Ρ‚ΡŒ Π΅Π³ΠΎ Π½Π° Π΅Π΄ΠΈΠ½ΠΈΡ†Ρƒ ΠΊΠ°ΠΆΠ΄Ρ‹ΠΉ Ρ€Π°Π·, ΠΊΠΎΠ³Π΄Π° Π² столбцС field встрСчаСтся Π·Π½Π°Ρ‡Π΅Π½ΠΈΠ΅ β€œname”:

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   [email protected]          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  [email protected]
#> 3         3 Huxley Ratcliffe <NA>    <NA>

Π—Π°ΠΊΠ»ΡŽΡ‡Π΅Π½ΠΈΠ΅

Π›ΠΈΡ‡Π½ΠΎ ΠΌΠΎΡ‘ ΠΌΠ½Π΅Π½ΠΈΠ΅, Ρ‡Ρ‚ΠΎ новая концСпция tidyr Π΄Π΅ΠΉΡΡ‚Π²ΠΈΡ‚Π΅Π»ΡŒΠ½ΠΎ ΠΈΠ½Ρ‚ΡƒΠΈΡ‚ΠΈΠ²Π½ΠΎ Π±ΠΎΠ»Π΅Π΅ понятна, ΠΈ Π·Π½Π°Ρ‡ΠΈΡ‚Π΅Π»ΡŒΠ½ΠΎ прСвосходит ΠΏΠΎ Ρ„ΡƒΠ½ΠΊΡ†ΠΈΠΎΠ½Π°Π»Ρƒ ΡƒΡΡ‚Π°Ρ€Π΅Π²ΡˆΠΈΠ΅ Ρ„ΡƒΠ½ΠΊΡ†ΠΈΠΉ spread() ΠΈ gather(). НадСюсь эта ΡΡ‚Π°Ρ‚ΡŒΡ ΠΏΠΎΠΌΠΎΠ³Π»Π° Π²Π°ΠΌ Ρ€Π°Π·ΠΎΠ±Ρ€Π°Ρ‚ΡŒΡΡ с pivot_longer() ΠΈ pivot_wider().

Π˜ΡΡ‚ΠΎΡ‡Π½ΠΈΠΊ: habr.com

Π”ΠΎΠ±Π°Π²ΠΈΡ‚ΡŒ ΠΊΠΎΠΌΠΌΠ΅Π½Ρ‚Π°Ρ€ΠΈΠΉ