āĻ¨ā§‡āĻ¸ā§āĻŸā§‡āĻĄ āĻ•āĻ˛āĻžāĻŽāĻ—ā§āĻ˛āĻŋ āĻĒā§āĻ°āĻ¸āĻžāĻ°āĻŋāĻ¤ āĻ•āĻ°āĻž āĻšāĻšā§āĻ›ā§‡ - R āĻ­āĻžāĻˇāĻž āĻŦā§āĻ¯āĻŦāĻšāĻžāĻ° āĻ•āĻ°ā§‡ āĻ¤āĻžāĻ˛āĻŋāĻ•āĻžāĻ—ā§āĻ˛āĻŋ (āĻ¸ā§āĻˇā§āĻ ā§ āĻĒā§āĻ¯āĻžāĻ•ā§‡āĻœ āĻāĻŦāĻ‚ āĻ†āĻ¨āĻ¨ā§‡āĻ¸ā§āĻŸ āĻĒāĻ°āĻŋāĻŦāĻžāĻ°ā§‡āĻ° āĻĢāĻžāĻ‚āĻļāĻ¨)

āĻŦā§‡āĻļāĻŋāĻ°āĻ­āĻžāĻ— āĻ•ā§āĻˇā§‡āĻ¤ā§āĻ°ā§‡, āĻ¯āĻ–āĻ¨ āĻāĻ•āĻŸāĻŋ API āĻĨā§‡āĻ•ā§‡ āĻĒā§āĻ°āĻžāĻĒā§āĻ¤ āĻĒā§āĻ°āĻ¤āĻŋāĻ•ā§āĻ°āĻŋāĻ¯āĻŧāĻžāĻ° āĻ¸āĻžāĻĨā§‡ āĻ•āĻžāĻœ āĻ•āĻ°āĻž āĻšāĻ¯āĻŧ, āĻŦāĻž āĻœāĻŸāĻŋāĻ˛ āĻ—āĻžāĻ›ā§‡āĻ° āĻ•āĻžāĻ āĻžāĻŽā§‹ āĻ°āĻ¯āĻŧā§‡āĻ›ā§‡ āĻāĻŽāĻ¨ āĻ…āĻ¨ā§āĻ¯ āĻ•ā§‹āĻ¨ā§‹ āĻĄā§‡āĻŸāĻžāĻ° āĻ¸āĻžāĻĨā§‡ āĻ•āĻžāĻœ āĻ•āĻ°āĻžāĻ° āĻ¸āĻŽāĻ¯āĻŧ, āĻ†āĻĒāĻ¨āĻŋ JSON āĻāĻŦāĻ‚ XML āĻĢāĻ°ā§āĻŽā§āĻ¯āĻžāĻŸā§‡āĻ° āĻ¸āĻŽā§āĻŽā§āĻ–ā§€āĻ¨ āĻšāĻ¨āĨ¤

āĻāĻ‡ āĻĢāĻ°ā§āĻŽā§āĻ¯āĻžāĻŸāĻ—ā§āĻ˛āĻŋāĻ° āĻ…āĻ¨ā§‡āĻ• āĻ¸ā§āĻŦāĻŋāĻ§āĻž āĻ°āĻ¯āĻŧā§‡āĻ›ā§‡: āĻāĻ—ā§āĻ˛āĻŋ āĻŦā§‡āĻļ āĻ¸āĻ‚āĻ•ā§āĻˇāĻŋāĻĒā§āĻ¤āĻ­āĻžāĻŦā§‡ āĻĄā§‡āĻŸāĻž āĻ¸āĻžā§āĻšāĻ¯āĻŧ āĻ•āĻ°ā§‡ āĻāĻŦāĻ‚ āĻ†āĻĒāĻ¨āĻžāĻ•ā§‡ āĻ¤āĻĨā§āĻ¯ā§‡āĻ° āĻ…āĻĒā§āĻ°āĻ¯āĻŧā§‹āĻœāĻ¨ā§€āĻ¯āĻŧ āĻ¨āĻ•āĻ˛ āĻāĻĄāĻŧāĻžāĻ¤ā§‡ āĻĻā§‡āĻ¯āĻŧāĨ¤

āĻāĻ‡ āĻĢāĻ°ā§āĻŽā§āĻ¯āĻžāĻŸāĻ—ā§āĻ˛āĻŋāĻ° āĻ…āĻ¸ā§āĻŦāĻŋāĻ§āĻž āĻšāĻ˛ āĻ¤āĻžāĻĻā§‡āĻ° āĻĒā§āĻ°āĻ•ā§āĻ°āĻŋāĻ¯āĻŧāĻžāĻ•āĻ°āĻŖ āĻāĻŦāĻ‚ āĻŦāĻŋāĻļā§āĻ˛ā§‡āĻˇāĻŖā§‡āĻ° āĻœāĻŸāĻŋāĻ˛āĻ¤āĻžāĨ¤ āĻ…āĻ¸āĻ‚āĻ—āĻ āĻŋāĻ¤ āĻĄā§‡āĻŸāĻž āĻ—āĻŖāĻ¨āĻžāĻ¯āĻŧ āĻŦā§āĻ¯āĻŦāĻšāĻžāĻ° āĻ•āĻ°āĻž āĻ¯āĻžāĻ¯āĻŧ āĻ¨āĻž āĻāĻŦāĻ‚ āĻāĻ° āĻ‰āĻĒāĻ° āĻ­āĻŋāĻœā§āĻ¯ā§āĻ¯āĻŧāĻžāĻ˛āĻžāĻ‡āĻœā§‡āĻļāĻ¨ āĻ¤ā§ˆāĻ°āĻŋ āĻ•āĻ°āĻž āĻ¯āĻžāĻ¯āĻŧ āĻ¨āĻžāĨ¤

āĻ¨ā§‡āĻ¸ā§āĻŸā§‡āĻĄ āĻ•āĻ˛āĻžāĻŽāĻ—ā§āĻ˛āĻŋ āĻĒā§āĻ°āĻ¸āĻžāĻ°āĻŋāĻ¤ āĻ•āĻ°āĻž āĻšāĻšā§āĻ›ā§‡ - R āĻ­āĻžāĻˇāĻž āĻŦā§āĻ¯āĻŦāĻšāĻžāĻ° āĻ•āĻ°ā§‡ āĻ¤āĻžāĻ˛āĻŋāĻ•āĻžāĻ—ā§āĻ˛āĻŋ (āĻ¸ā§āĻˇā§āĻ ā§ āĻĒā§āĻ¯āĻžāĻ•ā§‡āĻœ āĻāĻŦāĻ‚ āĻ†āĻ¨āĻ¨ā§‡āĻ¸ā§āĻŸ āĻĒāĻ°āĻŋāĻŦāĻžāĻ°ā§‡āĻ° āĻĢāĻžāĻ‚āĻļāĻ¨)

āĻāĻ‡ āĻ¨āĻŋāĻŦāĻ¨ā§āĻ§āĻŸāĻŋ āĻĒā§āĻ°āĻ•āĻžāĻļāĻ¨āĻžāĻ° āĻāĻ•āĻŸāĻŋ āĻ¯ā§ŒāĻ•ā§āĻ¤āĻŋāĻ• āĻ§āĻžāĻ°āĻžāĻŦāĻžāĻšāĻŋāĻ•āĻ¤āĻž "āĻ†āĻ° āĻĒā§āĻ¯āĻžāĻ•ā§‡āĻœ āĻŸāĻžāĻ‡āĻĄāĻžāĻ° āĻāĻŦāĻ‚ āĻāĻ° āĻ¨āĻ¤ā§āĻ¨ āĻĢāĻžāĻ‚āĻļāĻ¨āĻ—ā§āĻ˛āĻŋ pivot_longer āĻāĻŦāĻ‚ pivot_wider". āĻāĻŸāĻŋ āĻ†āĻĒāĻ¨āĻžāĻ•ā§‡ āĻĒā§āĻ¯āĻžāĻ•ā§‡āĻœāĻŸāĻŋ āĻŦā§āĻ¯āĻŦāĻšāĻžāĻ° āĻ•āĻ°ā§‡ āĻ…āĻ¸āĻ‚āĻ—āĻ āĻŋāĻ¤ āĻĄā§‡āĻŸāĻž āĻ¸ā§āĻŸā§āĻ°āĻžāĻ•āĻšāĻžāĻ°āĻ—ā§āĻ˛āĻŋāĻ•ā§‡ āĻāĻ•āĻŸāĻŋ āĻĒāĻ°āĻŋāĻšāĻŋāĻ¤ āĻāĻŦāĻ‚ āĻŦāĻŋāĻļā§āĻ˛ā§‡āĻˇāĻŖā§‡āĻ° āĻœāĻ¨ā§āĻ¯ āĻ‰āĻĒāĻ¯ā§‹āĻ—ā§€ āĻ¸āĻžāĻ°āĻŖā§€ āĻ†āĻ•āĻžāĻ°ā§‡ āĻ†āĻ¨āĻ¤ā§‡ āĻ¸āĻžāĻšāĻžāĻ¯ā§āĻ¯ āĻ•āĻ°āĻŦā§‡ tidyr, āĻ—ā§āĻ°āĻ¨ā§āĻĨāĻžāĻ—āĻžāĻ°ā§‡āĻ° āĻŽā§‚āĻ˛ āĻ…āĻ‚āĻļā§‡ āĻ…āĻ¨ā§āĻ¤āĻ°ā§āĻ­ā§āĻ•ā§āĻ¤ tidyverse, āĻāĻŦāĻ‚ āĻĢāĻžāĻ‚āĻļāĻ¨ āĻāĻ° āĻĒāĻ°āĻŋāĻŦāĻžāĻ° unnest_*().

āĻ¸āĻ¨ā§āĻ¤ā§āĻˇā§āĻŸ

āĻ†āĻĒāĻ¨āĻŋ āĻ¯āĻĻāĻŋ āĻĄā§‡āĻŸāĻž āĻŦāĻŋāĻļā§āĻ˛ā§‡āĻˇāĻŖā§‡ āĻ†āĻ—ā§āĻ°āĻšā§€ āĻšāĻ¨ āĻ¤āĻŦā§‡ āĻ†āĻĒāĻ¨āĻŋ āĻ†āĻŽāĻžāĻ° āĻĒā§āĻ°āĻ¤āĻŋ āĻ†āĻ—ā§āĻ°āĻšā§€ āĻšāĻ¤ā§‡ āĻĒāĻžāĻ°ā§‡āĻ¨ āĻŸā§‡āĻ˛āĻŋāĻ—ā§āĻ°āĻžāĻŽ и āĻ‡āĻ‰āĻŸāĻŋāĻ‰āĻŦ āĻšā§āĻ¯āĻžāĻ¨ā§‡āĻ˛ āĻ¯āĻžāĻ° āĻŦā§‡āĻļāĻŋāĻ°āĻ­āĻžāĻ— āĻŦāĻŋāĻˇāĻ¯āĻŧāĻŦāĻ¸ā§āĻ¤ā§ āĻ†āĻ° āĻ­āĻžāĻˇāĻžāĻ•ā§‡ āĻ¨āĻŋāĻŦā§‡āĻĻāĻŋāĻ¤āĨ¤

  1. āĻ­ā§‚āĻŽāĻŋāĻ•āĻž
  2. GitHub āĻŦā§āĻ¯āĻŦāĻšāĻžāĻ°āĻ•āĻžāĻ°ā§€āĻ°āĻž
  3. Github āĻ¸āĻ‚āĻ—ā§āĻ°āĻšāĻ¸ā§āĻĨāĻ˛
  4. āĻ—ā§‡āĻŽ āĻ…āĻĢ āĻĨā§āĻ°ā§‹āĻ¨āĻ¸ āĻšāĻ°āĻŋāĻ¤ā§āĻ°
  5. āĻ—ā§āĻ—āĻ˛ā§‡āĻ° āĻ¸āĻžāĻĨā§‡ āĻœāĻŋāĻ“āĻ•ā§‹āĻĄāĻŋāĻ‚
  6. āĻļāĻžāĻ°ā§āĻ˛āĻž āĻ—ā§‡āĻ˛āĻĢāĻžāĻ¨ā§āĻĄā§‡āĻ° āĻĄāĻŋāĻ¸āĻ•ā§‹āĻ—ā§āĻ°āĻžāĻĢāĻŋ
  7. āĻ‰āĻĒāĻ¸āĻ‚āĻšāĻžāĻ°

āĻ­ā§‚āĻŽāĻŋāĻ•āĻž

āĻ†āĻ¯āĻŧāĻ¤āĻ•ā§āĻˇā§‡āĻ¤ā§āĻ° (āĻ…āĻ¨ā§āĻŦāĻžāĻĻāĻ•ā§‡āĻ° āĻĻā§āĻ°āĻˇā§āĻŸāĻŦā§āĻ¯, āĻ†āĻŽāĻŋ āĻāĻ‡ āĻļāĻŦā§āĻĻāĻŸāĻŋāĻ° āĻœāĻ¨ā§āĻ¯ āĻĒāĻ°ā§āĻ¯āĻžāĻĒā§āĻ¤ āĻ…āĻ¨ā§āĻŦāĻžāĻĻā§‡āĻ° āĻŦāĻŋāĻ•āĻ˛ā§āĻĒ āĻ–ā§āĻāĻœā§‡ āĻĒāĻžāĻ‡āĻ¨āĻŋ, āĻ¤āĻžāĻ‡ āĻ†āĻŽāĻ°āĻž āĻāĻŸāĻŋāĻ•ā§‡ āĻ°ā§‡āĻ–ā§‡ āĻĻā§‡āĻŦāĨ¤) āĻĒāĻ°āĻŋāĻšāĻŋāĻ¤ āĻ¸āĻžāĻ°āĻŋ āĻāĻŦāĻ‚ āĻ•āĻ˛āĻžāĻŽ āĻ¸āĻŽāĻ¨ā§āĻŦāĻŋāĻ¤ āĻāĻ•āĻŸāĻŋ āĻĻā§āĻŦāĻŋ-āĻŽāĻžāĻ¤ā§āĻ°āĻŋāĻ• āĻŸā§‡āĻŦāĻŋāĻ˛ā§‡ āĻ¨ā§‡āĻ¸ā§āĻŸā§‡āĻĄ āĻ…ā§āĻ¯āĻžāĻ°ā§‡ āĻ¸āĻš āĻ…āĻ¸āĻ‚āĻ—āĻ āĻŋāĻ¤ āĻĄā§‡āĻŸāĻž āĻ†āĻ¨āĻžāĻ° āĻĒā§āĻ°āĻ•ā§āĻ°āĻŋāĻ¯āĻŧāĻžāĨ¤ āĻ­āĻŋāĻ¤āĻ°ā§‡ tidyr āĻŦā§‡āĻļ āĻ•āĻ¯āĻŧā§‡āĻ•āĻŸāĻŋ āĻĢāĻžāĻ‚āĻļāĻ¨ āĻ°āĻ¯āĻŧā§‡āĻ›ā§‡ āĻ¯āĻž āĻ†āĻĒāĻ¨āĻžāĻ•ā§‡ āĻ¨ā§‡āĻ¸ā§āĻŸā§‡āĻĄ āĻ¤āĻžāĻ˛āĻŋāĻ•āĻž āĻ•āĻ˛āĻžāĻŽāĻ—ā§āĻ˛āĻŋ āĻĒā§āĻ°āĻ¸āĻžāĻ°āĻŋāĻ¤ āĻ•āĻ°āĻ¤ā§‡ āĻāĻŦāĻ‚ āĻāĻ•āĻŸāĻŋ āĻ†āĻ¯āĻŧāĻ¤āĻ•ā§āĻˇā§‡āĻ¤ā§āĻ°āĻžāĻ•āĻžāĻ°, āĻ¸āĻžāĻ°āĻŖā§€ āĻ†āĻ•āĻžāĻ°ā§‡ āĻĄā§‡āĻŸāĻž āĻšā§āĻ°āĻžāĻ¸ āĻ•āĻ°āĻ¤ā§‡ āĻ¸āĻšāĻžāĻ¯āĻŧāĻ¤āĻž āĻ•āĻ°āĻŦā§‡:

  • unnest_longer() āĻ•āĻ˛āĻžāĻŽ āĻ¤āĻžāĻ˛āĻŋāĻ•āĻžāĻ° āĻĒā§āĻ°āĻ¤āĻŋāĻŸāĻŋ āĻ‰āĻĒāĻžāĻĻāĻžāĻ¨ āĻ¨ā§‡āĻ¯āĻŧ āĻāĻŦāĻ‚ āĻāĻ•āĻŸāĻŋ āĻ¨āĻ¤ā§āĻ¨ āĻ¸āĻžāĻ°āĻŋ āĻ¤ā§ˆāĻ°āĻŋ āĻ•āĻ°ā§‡āĨ¤
  • unnest_wider() āĻ•āĻ˛āĻžāĻŽ āĻ¤āĻžāĻ˛āĻŋāĻ•āĻžāĻ° āĻĒā§āĻ°āĻ¤āĻŋāĻŸāĻŋ āĻ‰āĻĒāĻžāĻĻāĻžāĻ¨ āĻ¨ā§‡āĻ¯āĻŧ āĻāĻŦāĻ‚ āĻāĻ•āĻŸāĻŋ āĻ¨āĻ¤ā§āĻ¨ āĻ•āĻ˛āĻžāĻŽ āĻ¤ā§ˆāĻ°āĻŋ āĻ•āĻ°ā§‡āĨ¤
  • unnest_auto() āĻ•ā§‹āĻ¨ āĻĢāĻžāĻ‚āĻļāĻ¨ āĻŦā§āĻ¯āĻŦāĻšāĻžāĻ° āĻ•āĻ°āĻž āĻ­āĻžāĻ˛ āĻ¤āĻž āĻ¸ā§āĻŦāĻ¯āĻŧāĻ‚āĻ•ā§āĻ°āĻŋāĻ¯āĻŧāĻ­āĻžāĻŦā§‡ āĻ¨āĻŋāĻ°ā§āĻ§āĻžāĻ°āĻŖ āĻ•āĻ°ā§‡
    unnest_longer() āĻŦāĻž unnest_wider().
  • hoist() āĻ…āĻ¨ā§āĻ°ā§‚āĻĒ, āĻāĻ•āĻ‡, āĻ¸āĻŽāĻ¤ā§āĻ˛ā§āĻ¯ unnest_wider() āĻ•āĻŋāĻ¨ā§āĻ¤ā§ āĻļā§āĻ§ā§āĻŽāĻžāĻ¤ā§āĻ° āĻ¨āĻŋāĻ°ā§āĻĻāĻŋāĻˇā§āĻŸ āĻ‰āĻĒāĻžāĻĻāĻžāĻ¨ āĻ¨āĻŋāĻ°ā§āĻŦāĻžāĻšāĻ¨ āĻ•āĻ°ā§‡ āĻāĻŦāĻ‚ āĻ†āĻĒāĻ¨āĻžāĻ•ā§‡ āĻ¨ā§‡āĻ¸ā§āĻŸāĻŋāĻ‚āĻ¯āĻŧā§‡āĻ° āĻŦāĻŋāĻ­āĻŋāĻ¨ā§āĻ¨ āĻ¸ā§āĻ¤āĻ°ā§‡āĻ° āĻ¸āĻžāĻĨā§‡ āĻ•āĻžāĻœ āĻ•āĻ°āĻžāĻ° āĻ…āĻ¨ā§āĻŽāĻ¤āĻŋ āĻĻā§‡āĻ¯āĻŧāĨ¤

āĻĻā§āĻŦāĻŋ-āĻŽāĻžāĻ¤ā§āĻ°āĻŋāĻ• āĻ¸āĻžāĻ°āĻŖā§€āĻ¤ā§‡ āĻŦāĻŋāĻ­āĻŋāĻ¨ā§āĻ¨ āĻ¸ā§āĻ¤āĻ°ā§‡āĻ° āĻ¨ā§‡āĻ¸ā§āĻŸāĻŋāĻ‚ āĻ¸āĻš āĻ…āĻ¸āĻ‚āĻ—āĻ āĻŋāĻ¤ āĻĄā§‡āĻŸāĻž āĻ†āĻ¨āĻžāĻ° āĻ¸āĻžāĻĨā§‡ āĻ¸āĻŽā§āĻĒāĻ°ā§āĻ•āĻŋāĻ¤ āĻŦā§‡āĻļāĻŋāĻ°āĻ­āĻžāĻ— āĻ¸āĻŽāĻ¸ā§āĻ¯āĻž dplyr-āĻāĻ° āĻ¸āĻžāĻĨā§‡ āĻ¤āĻžāĻ˛āĻŋāĻ•āĻžāĻ­ā§āĻ•ā§āĻ¤ āĻĢāĻžāĻ‚āĻļāĻ¨āĻ—ā§āĻ˛āĻŋāĻ•ā§‡ āĻāĻ•āĻ¤ā§āĻ°āĻŋāĻ¤ āĻ•āĻ°ā§‡ āĻ¸āĻŽāĻžāĻ§āĻžāĻ¨ āĻ•āĻ°āĻž āĻ¯ā§‡āĻ¤ā§‡ āĻĒāĻžāĻ°ā§‡āĨ¤

āĻāĻ‡ āĻ•ā§ŒāĻļāĻ˛āĻ—ā§āĻ˛āĻŋ āĻĒā§āĻ°āĻĻāĻ°ā§āĻļāĻ¨ āĻ•āĻ°āĻ¤ā§‡, āĻ†āĻŽāĻ°āĻž āĻĒā§āĻ¯āĻžāĻ•ā§‡āĻœāĻŸāĻŋ āĻŦā§āĻ¯āĻŦāĻšāĻžāĻ° āĻ•āĻ°āĻŦ repurrrsive, āĻ¯āĻž āĻāĻ•āĻŸāĻŋ āĻ“āĻ¯āĻŧā§‡āĻŦ API āĻĨā§‡āĻ•ā§‡ āĻĒā§āĻ°āĻžāĻĒā§āĻ¤ āĻāĻ•āĻžāĻ§āĻŋāĻ• āĻœāĻŸāĻŋāĻ˛, āĻŦāĻšā§-āĻ¸ā§āĻ¤āĻ°ā§‡āĻ° āĻ¤āĻžāĻ˛āĻŋāĻ•āĻž āĻĒā§āĻ°āĻĻāĻžāĻ¨ āĻ•āĻ°ā§‡āĨ¤

library(tidyr)
library(dplyr)
library(repurrrsive)

GitHub āĻŦā§āĻ¯āĻŦāĻšāĻžāĻ°āĻ•āĻžāĻ°ā§€āĻ°āĻž

āĻšāĻ˛ā§‹ āĻ†āĻŽāĻ°āĻž āĻļā§āĻ°ā§ āĻ•āĻ°āĻŋ gh_āĻŦā§āĻ¯āĻŦāĻšāĻžāĻ°āĻ•āĻžāĻ°ā§€, āĻāĻ•āĻŸāĻŋ āĻ¤āĻžāĻ˛āĻŋāĻ•āĻž āĻ¯āĻžāĻ¤ā§‡ āĻ›āĻ¯āĻŧāĻŸāĻŋ āĻ—āĻŋāĻŸāĻšāĻžāĻŦ āĻŦā§āĻ¯āĻŦāĻšāĻžāĻ°āĻ•āĻžāĻ°ā§€āĻ° āĻ¤āĻĨā§āĻ¯ āĻ°āĻ¯āĻŧā§‡āĻ›ā§‡āĨ¤ āĻĒā§āĻ°āĻĨāĻŽā§‡ āĻ¤āĻžāĻ˛āĻŋāĻ•āĻž āĻ°ā§‚āĻĒāĻžāĻ¨ā§āĻ¤āĻ° āĻ•āĻ°āĻž āĻ¯āĻžāĻ• gh_āĻŦā§āĻ¯āĻŦāĻšāĻžāĻ°āĻ•āĻžāĻ°ā§€ в āĻŸāĻŋāĻŦāĻ˛ āĻĢā§āĻ°ā§‡āĻŽ:

users <-   tibble( user = gh_users ) 

āĻāĻŸāĻŋ āĻāĻ•āĻŸāĻŋ āĻ¸āĻžāĻŽāĻžāĻ¨ā§āĻ¯ āĻŦāĻŋāĻĒāĻ°ā§€āĻ¤ āĻŽāĻ¨ā§‡ āĻšāĻ¯āĻŧ: āĻ•ā§‡āĻ¨ āĻāĻ•āĻŸāĻŋ āĻ¤āĻžāĻ˛āĻŋāĻ•āĻž āĻĒā§āĻ°āĻĻāĻžāĻ¨ āĻ•āĻ°ā§āĻ¨ gh_āĻŦā§āĻ¯āĻŦāĻšāĻžāĻ°āĻ•āĻžāĻ°ā§€, āĻāĻ•āĻŸāĻŋ āĻ†āĻ°ā§‹ āĻœāĻŸāĻŋāĻ˛ āĻ¤āĻĨā§āĻ¯ āĻ•āĻžāĻ āĻžāĻŽā§‹? āĻ•āĻŋāĻ¨ā§āĻ¤ā§ āĻāĻ•āĻŸāĻŋ āĻĄā§‡āĻŸāĻž āĻĢā§āĻ°ā§‡āĻŽā§‡āĻ° āĻāĻ•āĻŸāĻŋ āĻŦāĻĄāĻŧ āĻ¸ā§āĻŦāĻŋāĻ§āĻž āĻ°āĻ¯āĻŧā§‡āĻ›ā§‡: āĻāĻŸāĻŋ āĻāĻ•āĻžāĻ§āĻŋāĻ• āĻ­ā§‡āĻ•ā§āĻŸāĻ°āĻ•ā§‡ āĻāĻ•āĻ¤ā§āĻ°āĻŋāĻ¤ āĻ•āĻ°ā§‡ āĻ¯āĻžāĻ¤ā§‡ āĻ¸āĻŦāĻ•āĻŋāĻ›ā§ āĻāĻ•āĻŸāĻŋ āĻŦāĻ¸ā§āĻ¤ā§āĻ¤ā§‡ āĻŸā§āĻ°ā§āĻ¯āĻžāĻ• āĻ•āĻ°āĻž āĻšāĻ¯āĻŧāĨ¤

āĻĒā§āĻ°āĻ¤āĻŋāĻŸāĻŋ āĻŦāĻ¸ā§āĻ¤ā§āĻ° āĻ‰āĻĒāĻžāĻĻāĻžāĻ¨ users āĻāĻ•āĻŸāĻŋ āĻ¨āĻžāĻŽ āĻ¤āĻžāĻ˛āĻŋāĻ•āĻž āĻ¯ā§‡āĻ–āĻžāĻ¨ā§‡ āĻĒā§āĻ°āĻ¤āĻŋāĻŸāĻŋ āĻ‰āĻĒāĻžāĻĻāĻžāĻ¨ āĻāĻ•āĻŸāĻŋ āĻ•āĻ˛āĻžāĻŽ āĻĒā§āĻ°āĻ¤āĻŋāĻ¨āĻŋāĻ§āĻŋāĻ¤ā§āĻŦ āĻ•āĻ°ā§‡āĨ¤

names(users$user[[1]])
#>  [1] "login"               "id"                  "avatar_url"         
#>  [4] "gravatar_id"         "url"                 "html_url"           
#>  [7] "followers_url"       "following_url"       "gists_url"          
#> [10] "starred_url"         "subscriptions_url"   "organizations_url"  
#> [13] "repos_url"           "events_url"          "received_events_url"
#> [16] "type"                "site_admin"          "name"               
#> [19] "company"             "blog"                "location"           
#> [22] "email"               "hireable"            "bio"                
#> [25] "public_repos"        "public_gists"        "followers"          
#> [28] "following"           "created_at"          "updated_at"

āĻ¤āĻžāĻ˛āĻŋāĻ•āĻžāĻ° āĻ‰āĻĒāĻžāĻĻāĻžāĻ¨āĻ—ā§āĻ˛āĻŋāĻ•ā§‡ āĻ•āĻ˛āĻžāĻŽā§‡ āĻĒāĻ°āĻŋāĻŖāĻ¤ āĻ•āĻ°āĻžāĻ° āĻĻā§āĻŸāĻŋ āĻ‰āĻĒāĻžāĻ¯āĻŧ āĻ°āĻ¯āĻŧā§‡āĻ›ā§‡āĨ¤ unnest_wider() āĻĒā§āĻ°āĻ¤āĻŋāĻŸāĻŋ āĻ‰āĻĒāĻžāĻĻāĻžāĻ¨ āĻ¨ā§‡āĻ¯āĻŧ āĻāĻŦāĻ‚ āĻāĻ•āĻŸāĻŋ āĻ¨āĻ¤ā§āĻ¨ āĻ•āĻ˛āĻžāĻŽ āĻ¤ā§ˆāĻ°āĻŋ āĻ•āĻ°ā§‡:

users %>% unnest_wider(user)
#> # A tibble: 6 x 30
#>   login     id avatar_url gravatar_id url   html_url followers_url
#>   <chr>  <int> <chr>      <chr>       <chr> <chr>    <chr>        
#> 1 gaboâ€Ļ 6.60e5 https://aâ€Ļ ""          httpâ€Ļ https:/â€Ļ https://api.â€Ļ
#> 2 jennâ€Ļ 5.99e5 https://aâ€Ļ ""          httpâ€Ļ https:/â€Ļ https://api.â€Ļ
#> 3 jtleâ€Ļ 1.57e6 https://aâ€Ļ ""          httpâ€Ļ https:/â€Ļ https://api.â€Ļ
#> 4 juliâ€Ļ 1.25e7 https://aâ€Ļ ""          httpâ€Ļ https:/â€Ļ https://api.â€Ļ
#> 5 leepâ€Ļ 3.51e6 https://aâ€Ļ ""          httpâ€Ļ https:/â€Ļ https://api.â€Ļ
#> 6 masaâ€Ļ 8.36e6 https://aâ€Ļ ""          httpâ€Ļ https:/â€Ļ https://api.â€Ļ
#> # â€Ļ with 23 more variables: following_url <chr>, gists_url <chr>,
#> #   starred_url <chr>, subscriptions_url <chr>, organizations_url <chr>,
#> #   repos_url <chr>, events_url <chr>, received_events_url <chr>,
#> #   type <chr>, site_admin <lgl>, name <chr>, company <chr>, blog <chr>,
#> #   location <chr>, email <chr>, public_repos <int>, public_gists <int>,
#> #   followers <int>, following <int>, created_at <chr>, updated_at <chr>,
#> #   bio <chr>, hireable <lgl>

āĻāĻ‡ āĻ•ā§āĻˇā§‡āĻ¤ā§āĻ°ā§‡, āĻ†āĻŽāĻžāĻĻā§‡āĻ° āĻ•āĻžāĻ›ā§‡ 30 āĻŸāĻŋ āĻ•āĻ˛āĻžāĻŽ āĻ¨āĻŋāĻ¯āĻŧā§‡ āĻāĻ•āĻŸāĻŋ āĻŸā§‡āĻŦāĻŋāĻ˛ āĻ°āĻ¯āĻŧā§‡āĻ›ā§‡ āĻāĻŦāĻ‚ āĻ†āĻŽāĻžāĻĻā§‡āĻ° āĻ¸ā§‡āĻ—ā§āĻ˛āĻŋāĻ° āĻŦā§‡āĻļāĻŋāĻ°āĻ­āĻžāĻ—ā§‡āĻ° āĻĒā§āĻ°āĻ¯āĻŧā§‹āĻœāĻ¨ āĻšāĻŦā§‡ āĻ¨āĻž, āĻ¤āĻžāĻ‡ āĻ†āĻŽāĻ°āĻž āĻĒāĻ°āĻŋāĻŦāĻ°ā§āĻ¤ā§‡ āĻ•āĻ°āĻ¤ā§‡ āĻĒāĻžāĻ°āĻŋ unnest_wider() āĻŦā§āĻ¯āĻŦāĻšāĻžāĻ° āĻ•āĻ°āĻ¤ā§‡ hoist(). hoist() āĻ†āĻŽāĻžāĻĻā§‡āĻ°āĻ•ā§‡ āĻāĻ•āĻ‡ āĻ¸āĻŋāĻ¨āĻŸā§āĻ¯āĻžāĻ•ā§āĻ¸ āĻŦā§āĻ¯āĻŦāĻšāĻžāĻ° āĻ•āĻ°ā§‡ āĻ¨āĻŋāĻ°ā§āĻŦāĻžāĻšāĻŋāĻ¤ āĻ‰āĻĒāĻžāĻĻāĻžāĻ¨āĻ—ā§āĻ˛āĻŋ āĻŦā§‡āĻ° āĻ•āĻ°āĻ¤ā§‡ āĻĻā§‡āĻ¯āĻŧ purrr::pluck():

users %>% hoist(user, 
  followers = "followers", 
  login = "login", 
  url = "html_url"
)
#> # A tibble: 6 x 4
#>   followers login       url                            user             
#>       <int> <chr>       <chr>                          <list>           
#> 1       303 gaborcsardi https://github.com/gaborcsardi <named list [27]>
#> 2       780 jennybc     https://github.com/jennybc     <named list [27]>
#> 3      3958 jtleek      https://github.com/jtleek      <named list [27]>
#> 4       115 juliasilge  https://github.com/juliasilge  <named list [27]>
#> 5       213 leeper      https://github.com/leeper      <named list [27]>
#> 6        34 masalmon    https://github.com/masalmon    <named list [27]>

hoist() āĻāĻ•āĻŸāĻŋ āĻ•āĻ˛āĻžāĻŽ āĻ¤āĻžāĻ˛āĻŋāĻ•āĻž āĻĨā§‡āĻ•ā§‡ āĻ¨āĻŋāĻ°ā§āĻĻāĻŋāĻˇā§āĻŸ āĻ¨āĻžāĻŽāĻ¯ā§āĻ•ā§āĻ¤ āĻ‰āĻĒāĻžāĻĻāĻžāĻ¨āĻ—ā§āĻ˛āĻŋ āĻ¸āĻ°āĻŋāĻ¯āĻŧā§‡ āĻĻā§‡āĻ¯āĻŧ āĻŦā§āĻ¯āĻŦāĻšāĻžāĻ°āĻ•āĻžāĻ°ā§€āĻ¤āĻžāĻ‡ āĻ†āĻĒāĻ¨āĻŋ āĻŦāĻŋāĻŦā§‡āĻšāĻ¨āĻž āĻ•āĻ°āĻ¤ā§‡ āĻĒāĻžāĻ°ā§‡āĻ¨ hoist() āĻāĻ•āĻŸāĻŋ āĻ¤āĻžāĻ°āĻŋāĻ– āĻĢā§āĻ°ā§‡āĻŽā§‡āĻ° āĻ…āĻ­ā§āĻ¯āĻ¨ā§āĻ¤āĻ°ā§€āĻŖ āĻ¤āĻžāĻ˛āĻŋāĻ•āĻž āĻĨā§‡āĻ•ā§‡ āĻ¤āĻžāĻ° āĻļā§€āĻ°ā§āĻˇ āĻ¸ā§āĻ¤āĻ°ā§‡ āĻ‰āĻĒāĻžāĻĻāĻžāĻ¨āĻ—ā§āĻ˛āĻŋ āĻ¸āĻ°āĻžāĻ¨ā§‹āĻ° āĻŽāĻ¤ā§‹ā§ˇ

Github āĻ¸āĻ‚āĻ—ā§āĻ°āĻšāĻ¸ā§āĻĨāĻ˛

āĻ¤āĻžāĻ˛āĻŋāĻ•āĻž āĻĒā§āĻ°āĻžāĻ¨ā§āĻ¤āĻŋāĻ•āĻ•āĻ°āĻŖ gh_repos āĻ†āĻŽāĻ°āĻž āĻāĻŸāĻŋāĻ•ā§‡ āĻ°ā§‚āĻĒāĻžāĻ¨ā§āĻ¤āĻ° āĻ•āĻ°ā§‡ āĻāĻ•āĻ‡āĻ­āĻžāĻŦā§‡ āĻļā§āĻ°ā§ āĻ•āĻ°āĻŋ tibble:

repos <- tibble(repo = gh_repos)
repos
#> # A tibble: 6 x 1
#>   repo       
#>   <list>     
#> 1 <list [30]>
#> 2 <list [30]>
#> 3 <list [30]>
#> 4 <list [26]>
#> 5 <list [30]>
#> 6 <list [30]>

āĻāĻ‡ āĻ¸āĻŽāĻ¯āĻŧ āĻ‰āĻĒāĻžāĻĻāĻžāĻ¨ āĻŦā§āĻ¯āĻŦāĻšāĻžāĻ°āĻ•āĻžāĻ°ā§€ āĻāĻ‡ āĻŦā§āĻ¯āĻŦāĻšāĻžāĻ°āĻ•āĻžāĻ°ā§€āĻ° āĻŽāĻžāĻ˛āĻŋāĻ•āĻžāĻ¨āĻžāĻ§ā§€āĻ¨ āĻ¸āĻ‚āĻ—ā§āĻ°āĻšāĻ¸ā§āĻĨāĻ˛āĻ—ā§āĻ˛āĻŋāĻ° āĻāĻ•āĻŸāĻŋ āĻ¤āĻžāĻ˛āĻŋāĻ•āĻž āĻ‰āĻĒāĻ¸ā§āĻĨāĻžāĻĒāĻ¨ āĻ•āĻ°ā§āĻ¨āĨ¤ āĻĒā§āĻ°āĻ¤āĻŋāĻŸāĻŋ āĻ­āĻžāĻ¨ā§āĻĄāĻžāĻ° āĻāĻ•āĻŸāĻŋ āĻĒā§ƒāĻĨāĻ• āĻĒāĻ°ā§āĻ¯āĻŦā§‡āĻ•ā§āĻˇāĻŖ, āĻ¤āĻžāĻ‡ āĻāĻ°āĻāĻ°ā§‡ āĻ¤āĻĨā§āĻ¯ āĻ§āĻžāĻ°āĻŖāĻž āĻ…āĻ¨ā§āĻ¯āĻžāĻ¯āĻŧā§€ (āĻĒā§āĻ°āĻžāĻ¯āĻŧ āĻĒāĻ°āĻŋāĻĒāĻžāĻŸāĻŋ āĻ¤āĻĨā§āĻ¯) āĻ¤āĻžāĻĻā§‡āĻ° āĻ¨āĻ¤ā§āĻ¨ āĻ˛āĻžāĻ‡āĻ¨ āĻšāĻ“āĻ¯āĻŧāĻž āĻ‰āĻšāĻŋāĻ¤, āĻ¤āĻžāĻ‡ āĻ†āĻŽāĻ°āĻž āĻŦā§āĻ¯āĻŦāĻšāĻžāĻ° āĻ•āĻ°āĻŋ unnest_longer() āĻ•āĻŋāĻ¨ā§āĻ¤ā§ āĻ¨āĻž unnest_wider():

repos <- repos %>% unnest_longer(repo)
repos
#> # A tibble: 176 x 1
#>    repo             
#>    <list>           
#>  1 <named list [68]>
#>  2 <named list [68]>
#>  3 <named list [68]>
#>  4 <named list [68]>
#>  5 <named list [68]>
#>  6 <named list [68]>
#>  7 <named list [68]>
#>  8 <named list [68]>
#>  9 <named list [68]>
#> 10 <named list [68]>
#> # â€Ļ with 166 more rows

āĻāĻ–āĻ¨ āĻ†āĻŽāĻ°āĻž āĻŦā§āĻ¯āĻŦāĻšāĻžāĻ° āĻ•āĻ°āĻ¤ā§‡ āĻĒāĻžāĻ°ā§‡āĻ¨ unnest_wider() āĻŦāĻž hoist() :

repos %>% hoist(repo, 
  login = c("owner", "login"), 
  name = "name",
  homepage = "homepage",
  watchers = "watchers_count"
)
#> # A tibble: 176 x 5
#>    login       name        homepage watchers repo             
#>    <chr>       <chr>       <chr>       <int> <list>           
#>  1 gaborcsardi after       <NA>            5 <named list [65]>
#>  2 gaborcsardi argufy      <NA>           19 <named list [65]>
#>  3 gaborcsardi ask         <NA>            5 <named list [65]>
#>  4 gaborcsardi baseimports <NA>            0 <named list [65]>
#>  5 gaborcsardi citest      <NA>            0 <named list [65]>
#>  6 gaborcsardi clisymbols  ""             18 <named list [65]>
#>  7 gaborcsardi cmaker      <NA>            0 <named list [65]>
#>  8 gaborcsardi cmark       <NA>            0 <named list [65]>
#>  9 gaborcsardi conditions  <NA>            0 <named list [65]>
#> 10 gaborcsardi crayon      <NA>           52 <named list [65]>
#> # â€Ļ with 166 more rows

āĻŦā§āĻ¯āĻŦāĻšāĻžāĻ°ā§‡āĻ° āĻĻāĻŋāĻ•ā§‡ āĻŽāĻ¨ā§‹āĻ¯ā§‹āĻ— āĻĻāĻŋāĻ¨ c("owner", "login"): āĻāĻŸāĻŋ āĻ†āĻŽāĻžāĻĻā§‡āĻ° āĻ¨ā§‡āĻ¸ā§āĻŸā§‡āĻĄ āĻ¤āĻžāĻ˛āĻŋāĻ•āĻž āĻĨā§‡āĻ•ā§‡ āĻĻā§āĻŦāĻŋāĻ¤ā§€āĻ¯āĻŧ āĻ¸ā§āĻ¤āĻ°ā§‡āĻ° āĻŽāĻžāĻ¨ āĻĒā§‡āĻ¤ā§‡ āĻ…āĻ¨ā§āĻŽāĻ¤āĻŋ āĻĻā§‡āĻ¯āĻŧ owner. āĻāĻ•āĻŸāĻŋ āĻŦāĻŋāĻ•āĻ˛ā§āĻĒ āĻĒāĻĻā§āĻ§āĻ¤āĻŋ āĻ¸āĻŽā§āĻĒā§‚āĻ°ā§āĻŖ āĻ¤āĻžāĻ˛āĻŋāĻ•āĻž āĻĒā§‡āĻ¤ā§‡ āĻšāĻ¯āĻŧ owner āĻāĻŦāĻ‚ āĻ¤āĻžāĻ°āĻĒāĻ° āĻĢāĻžāĻ‚āĻļāĻ¨ āĻŦā§āĻ¯āĻŦāĻšāĻžāĻ° āĻ•āĻ°ā§‡ unnest_wider() āĻāĻ° āĻĒā§āĻ°āĻ¤āĻŋāĻŸāĻŋ āĻ‰āĻĒāĻžāĻĻāĻžāĻ¨āĻ•ā§‡ āĻāĻ•āĻŸāĻŋ āĻ•āĻ˛āĻžāĻŽā§‡ āĻ°āĻžāĻ–ā§āĻ¨:

repos %>% 
  hoist(repo, owner = "owner") %>% 
  unnest_wider(owner)
#> # A tibble: 176 x 18
#>    login     id avatar_url gravatar_id url   html_url followers_url
#>    <chr>  <int> <chr>      <chr>       <chr> <chr>    <chr>        
#>  1 gaboâ€Ļ 660288 https://aâ€Ļ ""          httpâ€Ļ https:/â€Ļ https://api.â€Ļ
#>  2 gaboâ€Ļ 660288 https://aâ€Ļ ""          httpâ€Ļ https:/â€Ļ https://api.â€Ļ
#>  3 gaboâ€Ļ 660288 https://aâ€Ļ ""          httpâ€Ļ https:/â€Ļ https://api.â€Ļ
#>  4 gaboâ€Ļ 660288 https://aâ€Ļ ""          httpâ€Ļ https:/â€Ļ https://api.â€Ļ
#>  5 gaboâ€Ļ 660288 https://aâ€Ļ ""          httpâ€Ļ https:/â€Ļ https://api.â€Ļ
#>  6 gaboâ€Ļ 660288 https://aâ€Ļ ""          httpâ€Ļ https:/â€Ļ https://api.â€Ļ
#>  7 gaboâ€Ļ 660288 https://aâ€Ļ ""          httpâ€Ļ https:/â€Ļ https://api.â€Ļ
#>  8 gaboâ€Ļ 660288 https://aâ€Ļ ""          httpâ€Ļ https:/â€Ļ https://api.â€Ļ
#>  9 gaboâ€Ļ 660288 https://aâ€Ļ ""          httpâ€Ļ https:/â€Ļ https://api.â€Ļ
#> 10 gaboâ€Ļ 660288 https://aâ€Ļ ""          httpâ€Ļ https:/â€Ļ https://api.â€Ļ
#> # â€Ļ with 166 more rows, and 11 more variables: following_url <chr>,
#> #   gists_url <chr>, starred_url <chr>, subscriptions_url <chr>,
#> #   organizations_url <chr>, repos_url <chr>, events_url <chr>,
#> #   received_events_url <chr>, type <chr>, site_admin <lgl>, repo <list>

āĻĒāĻ°āĻŋāĻŦāĻ°ā§āĻ¤ā§‡ āĻ¸āĻ āĻŋāĻ• āĻĢāĻžāĻ‚āĻļāĻ¨ āĻ¨āĻŋāĻ°ā§āĻŦāĻžāĻšāĻ¨ āĻ¸āĻŽā§āĻĒāĻ°ā§āĻ•ā§‡ āĻšāĻŋāĻ¨ā§āĻ¤āĻž unnest_longer() āĻŦāĻž unnest_wider() āĻ¤ā§āĻŽāĻŋ āĻŦā§āĻ¯āĻŦāĻšāĻžāĻ° āĻ•āĻ°āĻ¤ā§‡ āĻĒāĻžāĻ° unnest_auto(). āĻāĻ‡ āĻĢāĻžāĻ‚āĻļāĻ¨āĻŸāĻŋ āĻĄā§‡āĻŸāĻž āĻ°ā§‚āĻĒāĻžāĻ¨ā§āĻ¤āĻ°ā§‡āĻ° āĻœāĻ¨ā§āĻ¯ āĻ¸āĻŦāĻšā§‡āĻ¯āĻŧā§‡ āĻ‰āĻĒāĻ¯ā§āĻ•ā§āĻ¤ āĻĢāĻžāĻ‚āĻļāĻ¨ āĻ¨āĻŋāĻ°ā§āĻŦāĻžāĻšāĻ¨ āĻ•āĻ°āĻ¤ā§‡ āĻŦāĻŋāĻ­āĻŋāĻ¨ā§āĻ¨ āĻšāĻŋāĻ‰āĻ°āĻŋāĻ¸ā§āĻŸāĻŋāĻ• āĻĒāĻĻā§āĻ§āĻ¤āĻŋ āĻŦā§āĻ¯āĻŦāĻšāĻžāĻ° āĻ•āĻ°ā§‡ āĻāĻŦāĻ‚ āĻ¨āĻŋāĻ°ā§āĻŦāĻžāĻšāĻŋāĻ¤ āĻĒāĻĻā§āĻ§āĻ¤āĻŋ āĻ¸āĻŽā§āĻĒāĻ°ā§āĻ•ā§‡ āĻāĻ•āĻŸāĻŋ āĻŦāĻžāĻ°ā§āĻ¤āĻž āĻĒā§āĻ°āĻĻāĻ°ā§āĻļāĻ¨ āĻ•āĻ°ā§‡āĨ¤

tibble(repo = gh_repos) %>% 
  unnest_auto(repo) %>% 
  unnest_auto(repo)
#> Using `unnest_longer(repo)`; no element has names
#> Using `unnest_wider(repo)`; elements have 68 names in common
#> # A tibble: 176 x 67
#>        id name  full_name owner private html_url description fork  url  
#>     <int> <chr> <chr>     <lis> <lgl>   <chr>    <chr>       <lgl> <chr>
#>  1 6.12e7 after gaborcsaâ€Ļ <namâ€Ļ FALSE   https:/â€Ļ Run Code iâ€Ļ FALSE httpâ€Ļ
#>  2 4.05e7 arguâ€Ļ gaborcsaâ€Ļ <namâ€Ļ FALSE   https:/â€Ļ Declarativâ€Ļ FALSE httpâ€Ļ
#>  3 3.64e7 ask   gaborcsaâ€Ļ <namâ€Ļ FALSE   https:/â€Ļ Friendly Câ€Ļ FALSE httpâ€Ļ
#>  4 3.49e7 baseâ€Ļ gaborcsaâ€Ļ <namâ€Ļ FALSE   https:/â€Ļ Do we get â€Ļ FALSE httpâ€Ļ
#>  5 6.16e7 citeâ€Ļ gaborcsaâ€Ļ <namâ€Ļ FALSE   https:/â€Ļ Test R pacâ€Ļ TRUE  httpâ€Ļ
#>  6 3.39e7 clisâ€Ļ gaborcsaâ€Ļ <namâ€Ļ FALSE   https:/â€Ļ Unicode syâ€Ļ FALSE httpâ€Ļ
#>  7 3.72e7 cmakâ€Ļ gaborcsaâ€Ļ <namâ€Ļ FALSE   https:/â€Ļ port of cmâ€Ļ TRUE  httpâ€Ļ
#>  8 6.80e7 cmark gaborcsaâ€Ļ <namâ€Ļ FALSE   https:/â€Ļ CommonMarkâ€Ļ TRUE  httpâ€Ļ
#>  9 6.32e7 condâ€Ļ gaborcsaâ€Ļ <namâ€Ļ FALSE   https:/â€Ļ <NA>        TRUE  httpâ€Ļ
#> 10 2.43e7 crayâ€Ļ gaborcsaâ€Ļ <namâ€Ļ FALSE   https:/â€Ļ R package â€Ļ FALSE httpâ€Ļ
#> # â€Ļ with 166 more rows, and 58 more variables: forks_url <chr>,
#> #   keys_url <chr>, collaborators_url <chr>, teams_url <chr>,
#> #   hooks_url <chr>, issue_events_url <chr>, events_url <chr>,
#> #   assignees_url <chr>, branches_url <chr>, tags_url <chr>,
#> #   blobs_url <chr>, git_tags_url <chr>, git_refs_url <chr>,
#> #   trees_url <chr>, statuses_url <chr>, languages_url <chr>,
#> #   stargazers_url <chr>, contributors_url <chr>, subscribers_url <chr>,
#> #   subscription_url <chr>, commits_url <chr>, git_commits_url <chr>,
#> #   comments_url <chr>, issue_comment_url <chr>, contents_url <chr>,
#> #   compare_url <chr>, merges_url <chr>, archive_url <chr>,
#> #   downloads_url <chr>, issues_url <chr>, pulls_url <chr>,
#> #   milestones_url <chr>, notifications_url <chr>, labels_url <chr>,
#> #   releases_url <chr>, deployments_url <chr>, created_at <chr>,
#> #   updated_at <chr>, pushed_at <chr>, git_url <chr>, ssh_url <chr>,
#> #   clone_url <chr>, svn_url <chr>, size <int>, stargazers_count <int>,
#> #   watchers_count <int>, language <chr>, has_issues <lgl>,
#> #   has_downloads <lgl>, has_wiki <lgl>, has_pages <lgl>,
#> #   forks_count <int>, open_issues_count <int>, forks <int>,
#> #   open_issues <int>, watchers <int>, default_branch <chr>,
#> #   homepage <chr>

āĻ—ā§‡āĻŽ āĻ…āĻĢ āĻĨā§āĻ°ā§‹āĻ¨āĻ¸ āĻšāĻ°āĻŋāĻ¤ā§āĻ°

got_chars āĻāĻ•āĻŸāĻŋ āĻ…āĻ­āĻŋāĻ¨ā§āĻ¨ āĻ—āĻ āĻ¨ āĻ†āĻ›ā§‡ gh_users: āĻāĻŸāĻŋ āĻ¨āĻžāĻŽ āĻ•āĻ°āĻž āĻ¤āĻžāĻ˛āĻŋāĻ•āĻžāĻ° āĻāĻ•āĻŸāĻŋ āĻ¸ā§‡āĻŸ, āĻ¯ā§‡āĻ–āĻžāĻ¨ā§‡ āĻ…āĻ­ā§āĻ¯āĻ¨ā§āĻ¤āĻ°ā§€āĻŖ āĻ¤āĻžāĻ˛āĻŋāĻ•āĻžāĻ° āĻĒā§āĻ°āĻ¤āĻŋāĻŸāĻŋ āĻ‰āĻĒāĻžāĻĻāĻžāĻ¨ āĻ—ā§‡āĻŽ āĻ…āĻĢ āĻĨā§āĻ°ā§‹āĻ¨āĻ¸ āĻšāĻ°āĻŋāĻ¤ā§āĻ°ā§‡āĻ° āĻ•āĻŋāĻ›ā§ āĻŦā§ˆāĻļāĻŋāĻˇā§āĻŸā§āĻ¯ āĻŦāĻ°ā§āĻŖāĻ¨āĻž āĻ•āĻ°ā§‡āĨ¤ āĻ†āĻ¨āĻ¯āĻŧāĻ¨ got_chars āĻŸā§‡āĻŦāĻŋāĻ˛ āĻ­āĻŋāĻ‰āĻ¯āĻŧā§‡āĻ° āĻœāĻ¨ā§āĻ¯, āĻ†āĻŽāĻ°āĻž āĻĒā§‚āĻ°ā§āĻŦāĻŦāĻ°ā§āĻ¤ā§€ āĻ‰āĻĻāĻžāĻšāĻ°āĻŖāĻ—ā§āĻ˛āĻŋāĻ° āĻŽāĻ¤ā§‹ āĻāĻ•āĻŸāĻŋ āĻ¤āĻžāĻ°āĻŋāĻ– āĻĢā§āĻ°ā§‡āĻŽ āĻ¤ā§ˆāĻ°āĻŋ āĻ•āĻ°ā§‡ āĻļā§āĻ°ā§ āĻ•āĻ°āĻŋ āĻāĻŦāĻ‚ āĻ¤āĻžāĻ°āĻĒāĻ° āĻĒā§āĻ°āĻ¤āĻŋāĻŸāĻŋ āĻ‰āĻĒāĻžāĻĻāĻžāĻ¨āĻ•ā§‡ āĻāĻ•āĻŸāĻŋ āĻĒā§ƒāĻĨāĻ• āĻ•āĻ˛āĻžāĻŽā§‡ āĻ°ā§‚āĻĒāĻžāĻ¨ā§āĻ¤āĻ° āĻ•āĻ°āĻŋ:

chars <- tibble(char = got_chars)
chars
#> # A tibble: 30 x 1
#>    char             
#>    <list>           
#>  1 <named list [18]>
#>  2 <named list [18]>
#>  3 <named list [18]>
#>  4 <named list [18]>
#>  5 <named list [18]>
#>  6 <named list [18]>
#>  7 <named list [18]>
#>  8 <named list [18]>
#>  9 <named list [18]>
#> 10 <named list [18]>
#> # â€Ļ with 20 more rows

chars2 <- chars %>% unnest_wider(char)
chars2
#> # A tibble: 30 x 18
#>    url      id name  gender culture born  died  alive titles aliases father
#>    <chr> <int> <chr> <chr>  <chr>   <chr> <chr> <lgl> <list> <list>  <chr> 
#>  1 httpâ€Ļ  1022 Theoâ€Ļ Male   Ironboâ€Ļ In 2â€Ļ ""    TRUE  <chr â€Ļ <chr [â€Ļ ""    
#>  2 httpâ€Ļ  1052 Tyriâ€Ļ Male   ""      In 2â€Ļ ""    TRUE  <chr â€Ļ <chr [â€Ļ ""    
#>  3 httpâ€Ļ  1074 Victâ€Ļ Male   Ironboâ€Ļ In 2â€Ļ ""    TRUE  <chr â€Ļ <chr [â€Ļ ""    
#>  4 httpâ€Ļ  1109 Will  Male   ""      ""    In 2â€Ļ FALSE <chr â€Ļ <chr [â€Ļ ""    
#>  5 httpâ€Ļ  1166 Areoâ€Ļ Male   Norvosâ€Ļ In 2â€Ļ ""    TRUE  <chr â€Ļ <chr [â€Ļ ""    
#>  6 httpâ€Ļ  1267 Chett Male   ""      At Hâ€Ļ In 2â€Ļ FALSE <chr â€Ļ <chr [â€Ļ ""    
#>  7 httpâ€Ļ  1295 Cresâ€Ļ Male   ""      In 2â€Ļ In 2â€Ļ FALSE <chr â€Ļ <chr [â€Ļ ""    
#>  8 httpâ€Ļ   130 Ariaâ€Ļ Female Dornish In 2â€Ļ ""    TRUE  <chr â€Ļ <chr [â€Ļ ""    
#>  9 httpâ€Ļ  1303 Daenâ€Ļ Female Valyriâ€Ļ In 2â€Ļ ""    TRUE  <chr â€Ļ <chr [â€Ļ ""    
#> 10 httpâ€Ļ  1319 Davoâ€Ļ Male   Westerâ€Ļ In 2â€Ļ ""    TRUE  <chr â€Ļ <chr [â€Ļ ""    
#> # â€Ļ with 20 more rows, and 7 more variables: mother <chr>, spouse <chr>,
#> #   allegiances <list>, books <list>, povBooks <list>, tvSeries <list>,
#> #   playedBy <list>

āĻ—āĻ āĻ¨ got_chars āĻ¤ā§āĻ˛āĻ¨āĻžāĻ¯āĻŧ āĻ•āĻŋāĻ›ā§āĻŸāĻž āĻ•āĻ āĻŋāĻ¨ gh_users, āĻ•āĻžāĻ°āĻŖ āĻ•āĻŋāĻ›ā§ āĻ¤āĻžāĻ˛āĻŋāĻ•āĻž āĻ‰āĻĒāĻžāĻĻāĻžāĻ¨ char āĻ¨āĻŋāĻœā§‡āĻ°āĻž āĻāĻ•āĻŸāĻŋ āĻ¤āĻžāĻ˛āĻŋāĻ•āĻž, āĻĢāĻ˛āĻ¸ā§āĻŦāĻ°ā§‚āĻĒ āĻ†āĻŽāĻ°āĻž āĻĒāĻžāĻ‡āĻ˛āĻžāĻ° - āĻ¤āĻžāĻ˛āĻŋāĻ•āĻžāĻ—ā§āĻ˛āĻŋ:

chars2 %>% select_if(is.list)
#> # A tibble: 30 x 7
#>    titles    aliases    allegiances books     povBooks  tvSeries  playedBy 
#>    <list>    <list>     <list>      <list>    <list>    <list>    <list>   
#>  1 <chr [3]> <chr [4]>  <chr [1]>   <chr [3]> <chr [2]> <chr [6]> <chr [1]>
#>  2 <chr [2]> <chr [11]> <chr [1]>   <chr [2]> <chr [4]> <chr [6]> <chr [1]>
#>  3 <chr [2]> <chr [1]>  <chr [1]>   <chr [3]> <chr [2]> <chr [1]> <chr [1]>
#>  4 <chr [1]> <chr [1]>  <???>       <chr [1]> <chr [1]> <chr [1]> <chr [1]>
#>  5 <chr [1]> <chr [1]>  <chr [1]>   <chr [3]> <chr [2]> <chr [2]> <chr [1]>
#>  6 <chr [1]> <chr [1]>  <???>       <chr [2]> <chr [1]> <chr [1]> <chr [1]>
#>  7 <chr [1]> <chr [1]>  <???>       <chr [2]> <chr [1]> <chr [1]> <chr [1]>
#>  8 <chr [1]> <chr [1]>  <chr [1]>   <chr [4]> <chr [1]> <chr [1]> <chr [1]>
#>  9 <chr [5]> <chr [11]> <chr [1]>   <chr [1]> <chr [4]> <chr [6]> <chr [1]>
#> 10 <chr [4]> <chr [5]>  <chr [2]>   <chr [1]> <chr [3]> <chr [5]> <chr [1]>
#> # â€Ļ with 20 more rows

āĻ†āĻĒāĻ¨āĻžāĻ° āĻĒāĻ°āĻŦāĻ°ā§āĻ¤ā§€ āĻ•ā§āĻ°āĻŋāĻ¯āĻŧāĻžāĻ—ā§āĻ˛āĻŋ āĻŦāĻŋāĻļā§āĻ˛ā§‡āĻˇāĻŖā§‡āĻ° āĻ˛āĻ•ā§āĻˇā§āĻ¯āĻ—ā§āĻ˛āĻŋāĻ° āĻ‰āĻĒāĻ° āĻ¨āĻŋāĻ°ā§āĻ­āĻ° āĻ•āĻ°ā§‡āĨ¤ āĻ¸āĻŽā§āĻ­āĻŦāĻ¤ āĻ†āĻĒāĻ¨āĻžāĻ•ā§‡ āĻĒā§āĻ°āĻ¤āĻŋāĻŸāĻŋ āĻŦāĻ‡ āĻāĻŦāĻ‚ āĻ¸āĻŋāĻ°āĻŋāĻœā§‡āĻ° āĻœāĻ¨ā§āĻ¯ āĻ˛āĻžāĻ‡āĻ¨āĻ—ā§āĻ˛āĻŋāĻ¤ā§‡ āĻ¤āĻĨā§āĻ¯ āĻ°āĻžāĻ–āĻ¤ā§‡ āĻšāĻŦā§‡ āĻ¯ā§‡āĻ–āĻžāĻ¨ā§‡ āĻšāĻ°āĻŋāĻ¤ā§āĻ°āĻŸāĻŋ āĻĒā§āĻ°āĻĻāĻ°ā§āĻļāĻŋāĻ¤ āĻšāĻŦā§‡:

chars2 %>% 
  select(name, books, tvSeries) %>% 
  pivot_longer(c(books, tvSeries), names_to = "media", values_to = "value") %>% 
  unnest_longer(value)
#> # A tibble: 180 x 3
#>    name             media    value            
#>    <chr>            <chr>    <chr>            
#>  1 Theon Greyjoy    books    A Game of Thrones
#>  2 Theon Greyjoy    books    A Storm of Swords
#>  3 Theon Greyjoy    books    A Feast for Crows
#>  4 Theon Greyjoy    tvSeries Season 1         
#>  5 Theon Greyjoy    tvSeries Season 2         
#>  6 Theon Greyjoy    tvSeries Season 3         
#>  7 Theon Greyjoy    tvSeries Season 4         
#>  8 Theon Greyjoy    tvSeries Season 5         
#>  9 Theon Greyjoy    tvSeries Season 6         
#> 10 Tyrion Lannister books    A Feast for Crows
#> # â€Ļ with 170 more rows

āĻ…āĻĨāĻŦāĻž āĻšāĻ¯āĻŧāĻ¤ āĻ†āĻĒāĻ¨āĻŋ āĻāĻ•āĻŸāĻŋ āĻŸā§‡āĻŦāĻŋāĻ˛ āĻ¤ā§ˆāĻ°āĻŋ āĻ•āĻ°āĻ¤ā§‡ āĻšāĻžāĻ¨ āĻ¯āĻž āĻ†āĻĒāĻ¨āĻžāĻ•ā§‡ āĻ…āĻ•ā§āĻˇāĻ° āĻāĻŦāĻ‚ āĻ•āĻžāĻœā§‡āĻ° āĻ¸āĻžāĻĨā§‡ āĻŽā§‡āĻ˛āĻžāĻ¤ā§‡ āĻĻā§‡āĻ¯āĻŧ:

chars2 %>% 
  select(name, title = titles) %>% 
  unnest_longer(title)
#> # A tibble: 60 x 2
#>    name              title                                               
#>    <chr>             <chr>                                               
#>  1 Theon Greyjoy     Prince of Winterfell                                
#>  2 Theon Greyjoy     Captain of Sea Bitch                                
#>  3 Theon Greyjoy     Lord of the Iron Islands (by law of the green lands)
#>  4 Tyrion Lannister  Acting Hand of the King (former)                    
#>  5 Tyrion Lannister  Master of Coin (former)                             
#>  6 Victarion Greyjoy Lord Captain of the Iron Fleet                      
#>  7 Victarion Greyjoy Master of the Iron Victory                          
#>  8 Will              ""                                                  
#>  9 Areo Hotah        Captain of the Guard at Sunspear                    
#> 10 Chett             ""                                                  
#> # â€Ļ with 50 more rows

(āĻ–āĻžāĻ˛āĻŋ āĻŽāĻžāĻ¨ āĻ¨ā§‹āĻŸ āĻ•āĻ°ā§āĻ¨ "" āĻŽāĻžāĻ ā§‡ title, āĻāĻŸāĻŋ āĻĄā§‡āĻŸāĻž āĻĒā§āĻ°āĻŦā§‡āĻļ āĻ•āĻ°āĻžāĻ° āĻ¸āĻŽāĻ¯āĻŧ āĻ•āĻ°āĻž āĻ¤ā§āĻ°ā§āĻŸāĻŋāĻ° āĻ•āĻžāĻ°āĻŖā§‡ got_chars: āĻĒā§āĻ°āĻ•ā§ƒāĻ¤āĻĒāĻ•ā§āĻˇā§‡, āĻ…āĻ•ā§āĻˇāĻ° āĻ¯āĻžāĻ° āĻœāĻ¨ā§āĻ¯ āĻ•ā§āĻˇā§‡āĻ¤ā§āĻ°āĻŸāĻŋāĻ¤ā§‡ āĻ•ā§‹āĻ¨āĻ“ āĻ¸āĻ‚āĻļā§āĻ˛āĻŋāĻˇā§āĻŸ āĻŦāĻ‡ āĻāĻŦāĻ‚ āĻŸāĻŋāĻ­āĻŋ āĻ¸āĻŋāĻ°āĻŋāĻœā§‡āĻ° āĻļāĻŋāĻ°ā§‹āĻ¨āĻžāĻŽ āĻ¨ā§‡āĻ‡ā§ˇ title āĻĻā§ˆāĻ°ā§āĻ˜ā§āĻ¯ 0 āĻāĻ° āĻ­ā§‡āĻ•ā§āĻŸāĻ° āĻĨāĻžāĻ•āĻ¤ā§‡ āĻšāĻŦā§‡, āĻ–āĻžāĻ˛āĻŋ āĻ¸ā§āĻŸā§āĻ°āĻŋāĻ‚ āĻ§āĻžāĻ°āĻŖāĻ•āĻžāĻ°ā§€ āĻĻā§ˆāĻ°ā§āĻ˜ā§āĻ¯ 1 āĻāĻ° āĻ­ā§‡āĻ•ā§āĻŸāĻ° āĻ¨āĻ¯āĻŧāĨ¤)

āĻ†āĻŽāĻ°āĻž āĻĢāĻžāĻ‚āĻļāĻ¨ āĻŦā§āĻ¯āĻŦāĻšāĻžāĻ° āĻ•āĻ°ā§‡ āĻ‰āĻĒāĻ°ā§‡āĻ° āĻ‰āĻĻāĻžāĻšāĻ°āĻŖāĻŸāĻŋ āĻĒā§āĻ¨āĻ°āĻžāĻ¯āĻŧ āĻ˛āĻŋāĻ–āĻ¤ā§‡ āĻĒāĻžāĻ°āĻŋ unnest_auto(). āĻāĻ‡ āĻĒāĻĻā§āĻ§āĻ¤āĻŋāĻŸāĻŋ āĻāĻ•āĻ•āĻžāĻ˛ā§€āĻ¨ āĻŦāĻŋāĻļā§āĻ˛ā§‡āĻˇāĻŖā§‡āĻ° āĻœāĻ¨ā§āĻ¯ āĻ¸ā§āĻŦāĻŋāĻ§āĻžāĻœāĻ¨āĻ•, āĻ¤āĻŦā§‡ āĻ†āĻĒāĻ¨āĻžāĻ° āĻ‰āĻĒāĻ° āĻ¨āĻŋāĻ°ā§āĻ­āĻ° āĻ•āĻ°āĻž āĻ‰āĻšāĻŋāĻ¤ āĻ¨āĻ¯āĻŧ unnest_auto() āĻ¨āĻŋāĻ¯āĻŧāĻŽāĻŋāĻ¤ āĻŦā§āĻ¯āĻŦāĻšāĻžāĻ°ā§‡āĻ° āĻœāĻ¨ā§āĻ¯āĨ¤ āĻŽā§‹āĻĻā§āĻĻāĻž āĻ•āĻĨāĻž āĻšāĻ˛ āĻ†āĻĒāĻ¨āĻžāĻ° āĻĄāĻžāĻŸāĻž āĻ¸ā§āĻŸā§āĻ°āĻžāĻ•āĻšāĻžāĻ° āĻĒāĻ°āĻŋāĻŦāĻ°ā§āĻ¤āĻ¨ āĻšāĻ˛ā§‡ unnest_auto() āĻ¨āĻŋāĻ°ā§āĻŦāĻžāĻšāĻŋāĻ¤ āĻĄā§‡āĻŸāĻž āĻŸā§āĻ°āĻžāĻ¨ā§āĻ¸āĻĢāĻ°āĻŽā§‡āĻļāĻ¨ āĻŽā§‡āĻ•āĻžāĻ¨āĻŋāĻœāĻŽ āĻĒāĻ°āĻŋāĻŦāĻ°ā§āĻ¤āĻ¨ āĻ•āĻ°āĻ¤ā§‡ āĻĒāĻžāĻ°ā§‡ āĻ¯āĻĻāĻŋ āĻāĻŸāĻŋ āĻĒā§āĻ°āĻžāĻĨāĻŽāĻŋāĻ•āĻ­āĻžāĻŦā§‡ āĻ¤āĻžāĻ˛āĻŋāĻ•āĻž āĻ•āĻ˛āĻžāĻŽāĻ—ā§āĻ˛āĻŋāĻ•ā§‡ āĻ¸āĻžāĻ°āĻŋāĻ—ā§āĻ˛āĻŋāĻ¤ā§‡ āĻĒā§āĻ°āĻ¸āĻžāĻ°āĻŋāĻ¤ āĻ•āĻ°ā§‡ unnest_longer(), āĻ¤āĻžāĻ°āĻĒāĻ° āĻ¯āĻ–āĻ¨ āĻ‡āĻ¨āĻ•āĻžāĻŽāĻŋāĻ‚ āĻĄā§‡āĻŸāĻžāĻ° āĻ—āĻ āĻ¨ āĻĒāĻ°āĻŋāĻŦāĻ°ā§āĻ¤āĻŋāĻ¤ āĻšāĻ¯āĻŧ, āĻ¯ā§āĻ•ā§āĻ¤āĻŋāĻ° āĻĒāĻ•ā§āĻˇā§‡ āĻĒāĻ°āĻŋāĻŦāĻ°ā§āĻ¤āĻ¨ āĻ•āĻ°āĻž āĻ¯ā§‡āĻ¤ā§‡ āĻĒāĻžāĻ°ā§‡ unnest_wider(), āĻāĻŦāĻ‚ āĻāĻ•āĻŸāĻŋ āĻšāĻ˛āĻŽāĻžāĻ¨ āĻ­āĻŋāĻ¤ā§āĻ¤āĻŋāĻ¤ā§‡ āĻāĻ‡ āĻĒāĻĻā§āĻ§āĻ¤āĻŋ āĻŦā§āĻ¯āĻŦāĻšāĻžāĻ° āĻ•āĻ°ā§‡ āĻ…āĻĒā§āĻ°āĻ¤ā§āĻ¯āĻžāĻļāĻŋāĻ¤ āĻ¤ā§āĻ°ā§āĻŸāĻŋ āĻšāĻ¤ā§‡ āĻĒāĻžāĻ°ā§‡āĨ¤

tibble(char = got_chars) %>% 
  unnest_auto(char) %>% 
  select(name, title = titles) %>% 
  unnest_auto(title)
#> Using `unnest_wider(char)`; elements have 18 names in common
#> Using `unnest_longer(title)`; no element has names
#> # A tibble: 60 x 2
#>    name              title                                               
#>    <chr>             <chr>                                               
#>  1 Theon Greyjoy     Prince of Winterfell                                
#>  2 Theon Greyjoy     Captain of Sea Bitch                                
#>  3 Theon Greyjoy     Lord of the Iron Islands (by law of the green lands)
#>  4 Tyrion Lannister  Acting Hand of the King (former)                    
#>  5 Tyrion Lannister  Master of Coin (former)                             
#>  6 Victarion Greyjoy Lord Captain of the Iron Fleet                      
#>  7 Victarion Greyjoy Master of the Iron Victory                          
#>  8 Will              ""                                                  
#>  9 Areo Hotah        Captain of the Guard at Sunspear                    
#> 10 Chett             ""                                                  
#> # â€Ļ with 50 more rows

āĻ—ā§āĻ—āĻ˛ā§‡āĻ° āĻ¸āĻžāĻĨā§‡ āĻœāĻŋāĻ“āĻ•ā§‹āĻĄāĻŋāĻ‚

āĻāĻ° āĻĒāĻ°ā§‡, āĻ†āĻŽāĻ°āĻž Google āĻāĻ° āĻœāĻŋāĻ“āĻ•ā§‹āĻĄāĻŋāĻ‚ āĻĒāĻ°āĻŋāĻˇā§‡āĻŦāĻž āĻĨā§‡āĻ•ā§‡ āĻĒā§āĻ°āĻžāĻĒā§āĻ¤ āĻĄā§‡āĻŸāĻžāĻ° āĻ†āĻ°āĻ“ āĻœāĻŸāĻŋāĻ˛ āĻ•āĻžāĻ āĻžāĻŽā§‹ āĻĻā§‡āĻ–āĻŦāĨ¤ āĻ•ā§āĻ¯āĻžāĻļāĻŋāĻ‚ āĻļāĻ‚āĻ¸āĻžāĻĒāĻ¤ā§āĻ°āĻ—ā§āĻ˛āĻŋ Google āĻŽāĻžāĻ¨āĻšāĻŋāĻ¤ā§āĻ° API āĻāĻ° āĻ¸āĻžāĻĨā§‡ āĻ•āĻžāĻœ āĻ•āĻ°āĻžāĻ° āĻ¨āĻŋāĻ¯āĻŧāĻŽā§‡āĻ° āĻŦāĻŋāĻ°ā§āĻĻā§āĻ§ā§‡, āĻ¤āĻžāĻ‡ āĻ†āĻŽāĻŋ āĻĒā§āĻ°āĻĨāĻŽā§‡ API āĻāĻ° āĻšāĻžāĻ°āĻĒāĻžāĻļā§‡ āĻāĻ•āĻŸāĻŋ āĻ¸āĻžāĻ§āĻžāĻ°āĻŖ āĻŽā§‹āĻĄāĻŧāĻ• āĻ˛āĻŋāĻ–āĻŦāĨ¤ āĻ¯āĻž āĻāĻ•āĻŸāĻŋ āĻĒāĻ°āĻŋāĻŦā§‡āĻļ āĻĒāĻ°āĻŋāĻŦāĻ°ā§āĻ¤āĻ¨āĻļā§€āĻ˛ āĻŽāĻ§ā§āĻ¯ā§‡ Google āĻŽāĻžāĻ¨āĻšāĻŋāĻ¤ā§āĻ° API āĻ•ā§€ āĻ¸āĻ‚āĻ°āĻ•ā§āĻˇāĻŖā§‡āĻ° āĻ‰āĻĒāĻ° āĻ­āĻŋāĻ¤ā§āĻ¤āĻŋ āĻ•āĻ°ā§‡; āĻ†āĻĒāĻ¨āĻžāĻ° āĻāĻ¨āĻ­āĻžāĻ¯āĻŧāĻ°āĻ¨āĻŽā§‡āĻ¨ā§āĻŸ āĻ­ā§‡āĻ°āĻŋāĻ¯āĻŧā§‡āĻŦāĻ˛ā§‡ āĻ¸āĻžā§āĻšāĻŋāĻ¤ Google Maps API-āĻāĻ° āĻ¸āĻžāĻĨā§‡ āĻ•āĻžāĻœ āĻ•āĻ°āĻžāĻ° āĻ•ā§€ āĻ†āĻĒāĻ¨āĻžāĻ° āĻ•āĻžāĻ›ā§‡ āĻ¨āĻž āĻĨāĻžāĻ•āĻ˛ā§‡, āĻāĻ‡ āĻŦāĻŋāĻ­āĻžāĻ—ā§‡ āĻ‰āĻĒāĻ¸ā§āĻĨāĻžāĻĒāĻŋāĻ¤ āĻ•ā§‹āĻĄā§‡āĻ° āĻŸā§āĻ•āĻ°ā§‹āĻ—ā§āĻ˛āĻŋ āĻ•āĻžāĻ°ā§āĻ¯āĻ•āĻ° āĻ•āĻ°āĻž āĻšāĻŦā§‡ āĻ¨āĻžāĨ¤

has_key <- !identical(Sys.getenv("GOOGLE_MAPS_API_KEY"), "")
if (!has_key) {
  message("No Google Maps API key found; code chunks will not be run")
}

# https://developers.google.com/maps/documentation/geocoding
geocode <- function(address, api_key = Sys.getenv("GOOGLE_MAPS_API_KEY")) {
  url <- "https://maps.googleapis.com/maps/api/geocode/json"
  url <- paste0(url, "?address=", URLencode(address), "&key=", api_key)

  jsonlite::read_json(url)
}

āĻāĻ‡ āĻĢāĻžāĻ‚āĻļāĻ¨āĻŸāĻŋ āĻ¯ā§‡ āĻ¤āĻžāĻ˛āĻŋāĻ•āĻžāĻŸāĻŋ āĻĻā§‡āĻ¯āĻŧ āĻ¤āĻž āĻŦā§‡āĻļ āĻœāĻŸāĻŋāĻ˛:

houston <- geocode("Houston TX")
str(houston)
#> List of 2
#>  $ results:List of 1
#>   ..$ :List of 5
#>   .. ..$ address_components:List of 4
#>   .. .. ..$ :List of 3
#>   .. .. .. ..$ long_name : chr "Houston"
#>   .. .. .. ..$ short_name: chr "Houston"
#>   .. .. .. ..$ types     :List of 2
#>   .. .. .. .. ..$ : chr "locality"
#>   .. .. .. .. ..$ : chr "political"
#>   .. .. ..$ :List of 3
#>   .. .. .. ..$ long_name : chr "Harris County"
#>   .. .. .. ..$ short_name: chr "Harris County"
#>   .. .. .. ..$ types     :List of 2
#>   .. .. .. .. ..$ : chr "administrative_area_level_2"
#>   .. .. .. .. ..$ : chr "political"
#>   .. .. ..$ :List of 3
#>   .. .. .. ..$ long_name : chr "Texas"
#>   .. .. .. ..$ short_name: chr "TX"
#>   .. .. .. ..$ types     :List of 2
#>   .. .. .. .. ..$ : chr "administrative_area_level_1"
#>   .. .. .. .. ..$ : chr "political"
#>   .. .. ..$ :List of 3
#>   .. .. .. ..$ long_name : chr "United States"
#>   .. .. .. ..$ short_name: chr "US"
#>   .. .. .. ..$ types     :List of 2
#>   .. .. .. .. ..$ : chr "country"
#>   .. .. .. .. ..$ : chr "political"
#>   .. ..$ formatted_address : chr "Houston, TX, USA"
#>   .. ..$ geometry          :List of 4
#>   .. .. ..$ bounds       :List of 2
#>   .. .. .. ..$ northeast:List of 2
#>   .. .. .. .. ..$ lat: num 30.1
#>   .. .. .. .. ..$ lng: num -95
#>   .. .. .. ..$ southwest:List of 2
#>   .. .. .. .. ..$ lat: num 29.5
#>   .. .. .. .. ..$ lng: num -95.8
#>   .. .. ..$ location     :List of 2
#>   .. .. .. ..$ lat: num 29.8
#>   .. .. .. ..$ lng: num -95.4
#>   .. .. ..$ location_type: chr "APPROXIMATE"
#>   .. .. ..$ viewport     :List of 2
#>   .. .. .. ..$ northeast:List of 2
#>   .. .. .. .. ..$ lat: num 30.1
#>   .. .. .. .. ..$ lng: num -95
#>   .. .. .. ..$ southwest:List of 2
#>   .. .. .. .. ..$ lat: num 29.5
#>   .. .. .. .. ..$ lng: num -95.8
#>   .. ..$ place_id          : chr "ChIJAYWNSLS4QIYROwVl894CDco"
#>   .. ..$ types             :List of 2
#>   .. .. ..$ : chr "locality"
#>   .. .. ..$ : chr "political"
#>  $ status : chr "OK"

āĻ¸ā§ŒāĻ­āĻžāĻ—ā§āĻ¯āĻŦāĻļāĻ¤, āĻ†āĻŽāĻ°āĻž āĻĢāĻžāĻ‚āĻļāĻ¨ āĻŦā§āĻ¯āĻŦāĻšāĻžāĻ° āĻ•āĻ°ā§‡ āĻ§āĻžāĻĒā§‡ āĻ§āĻžāĻĒā§‡ āĻāĻ‡ āĻĄā§‡āĻŸāĻžāĻŸāĻŋāĻ•ā§‡ āĻŸā§āĻ¯āĻžāĻŦā§āĻ˛āĻžāĻ° āĻĢāĻ°ā§āĻŽā§‡ āĻ°ā§‚āĻĒāĻžāĻ¨ā§āĻ¤āĻ° āĻ•āĻ°āĻžāĻ° āĻ¸āĻŽāĻ¸ā§āĻ¯āĻžāĻ° āĻ¸āĻŽāĻžāĻ§āĻžāĻ¨ āĻ•āĻ°āĻ¤ā§‡ āĻĒāĻžāĻ°āĻŋ tidyr. āĻ•āĻžāĻœāĻŸāĻŋāĻ•ā§‡ āĻāĻ•āĻŸā§ āĻŦā§‡āĻļāĻŋ āĻšā§āĻ¯āĻžāĻ˛ā§‡āĻžā§āĻœāĻŋāĻ‚ āĻāĻŦāĻ‚ āĻŦāĻžāĻ¸ā§āĻ¤āĻŦāĻ¸āĻŽā§āĻŽāĻ¤ āĻ•āĻ°āĻ¤ā§‡, āĻ†āĻŽāĻŋ āĻ•āĻ¯āĻŧā§‡āĻ•āĻŸāĻŋ āĻļāĻšāĻ° āĻœāĻŋāĻ“āĻ•ā§‹āĻĄāĻŋāĻ‚ āĻ•āĻ°ā§‡ āĻļā§āĻ°ā§ āĻ•āĻ°āĻŦ:

  city <-   c ( "Houston" , "LA" , "New York" , "Chicago" , "Springfield" )  city_geo <-   purrr::map (city, geocode) 

āĻ†āĻŽāĻŋ āĻĢāĻ˛āĻŋāĻ¤ āĻĢāĻ˛āĻžāĻĢāĻ˛ā§‡ āĻ°ā§‚āĻĒāĻžāĻ¨ā§āĻ¤āĻ° āĻ•āĻ°āĻŦ tibble, āĻ¸ā§āĻŦāĻŋāĻ§āĻžāĻ° āĻœāĻ¨ā§āĻ¯, āĻ†āĻŽāĻŋ āĻ¸āĻ‚āĻļā§āĻ˛āĻŋāĻˇā§āĻŸ āĻļāĻšāĻ°ā§‡āĻ° āĻ¨āĻžāĻŽā§‡āĻ° āĻ¸āĻžāĻĨā§‡ āĻāĻ•āĻŸāĻŋ āĻ•āĻ˛āĻžāĻŽ āĻ¯ā§‹āĻ— āĻ•āĻ°āĻŦāĨ¤

loc <- tibble(city = city, json = city_geo)
loc
#> # A tibble: 5 x 2
#>   city        json            
#>   <chr>       <list>          
#> 1 Houston     <named list [2]>
#> 2 LA          <named list [2]>
#> 3 New York    <named list [2]>
#> 4 Chicago     <named list [2]>
#> 5 Springfield <named list [2]>

āĻĒā§āĻ°āĻĨāĻŽ āĻ¸ā§āĻ¤āĻ°ā§‡ āĻ‰āĻĒāĻžāĻĻāĻžāĻ¨ āĻ°āĻ¯āĻŧā§‡āĻ›ā§‡ status и result, āĻ¯āĻž āĻĻāĻŋāĻ¯āĻŧā§‡ āĻ†āĻŽāĻ°āĻž āĻĒā§āĻ°āĻ¸āĻžāĻ°āĻŋāĻ¤ āĻ•āĻ°āĻ¤ā§‡ āĻĒāĻžāĻ°āĻŋ unnest_wider() :

loc %>%
  unnest_wider(json)
#> # A tibble: 5 x 3
#>   city        results    status
#>   <chr>       <list>     <chr> 
#> 1 Houston     <list [1]> OK    
#> 2 LA          <list [1]> OK    
#> 3 New York    <list [1]> OK    
#> 4 Chicago     <list [1]> OK    
#> 5 Springfield <list [1]> OK

āĻŽāĻ¨ā§‡ āĻ°āĻžāĻ–āĻŦā§‡āĻ¨ āĻ¯ā§‡ results āĻāĻ•āĻŸāĻŋ āĻŦāĻšā§-āĻ¸ā§āĻ¤āĻ°ā§‡āĻ° āĻ¤āĻžāĻ˛āĻŋāĻ•āĻžāĨ¤ āĻŦā§‡āĻļāĻŋāĻ°āĻ­āĻžāĻ— āĻļāĻšāĻ°ā§‡ 1āĻŸāĻŋ āĻ‰āĻĒāĻžāĻĻāĻžāĻ¨ āĻ°āĻ¯āĻŧā§‡āĻ›ā§‡ (āĻœāĻŋāĻ“āĻ•ā§‹āĻĄāĻŋāĻ‚ API āĻāĻ° āĻ¸āĻžāĻĨā§‡ āĻ¸āĻŽā§āĻĒāĻ°ā§āĻ•āĻŋāĻ¤ āĻāĻ•āĻŸāĻŋ āĻ…āĻ¨āĻ¨ā§āĻ¯ āĻŽāĻžāĻ¨ āĻ‰āĻĒāĻ¸ā§āĻĨāĻžāĻĒāĻ¨ āĻ•āĻ°ā§‡), āĻ¤āĻŦā§‡ āĻ¸ā§āĻĒā§āĻ°āĻŋāĻ‚āĻĢāĻŋāĻ˛ā§āĻĄā§‡ āĻĻā§āĻŸāĻŋ āĻ°āĻ¯āĻŧā§‡āĻ›ā§‡āĨ¤ āĻ†āĻŽāĻ°āĻž āĻ¤āĻžāĻĻā§‡āĻ° āĻ¸āĻžāĻĨā§‡ āĻ†āĻ˛āĻžāĻĻāĻž āĻ˛āĻžāĻ‡āĻ¨ā§‡ āĻŸāĻžāĻ¨āĻ¤ā§‡ āĻĒāĻžāĻ°āĻŋ unnest_longer() :

loc %>%
  unnest_wider(json) %>% 
  unnest_longer(results)
#> # A tibble: 5 x 3
#>   city        results          status
#>   <chr>       <list>           <chr> 
#> 1 Houston     <named list [5]> OK    
#> 2 LA          <named list [5]> OK    
#> 3 New York    <named list [5]> OK    
#> 4 Chicago     <named list [5]> OK    
#> 5 Springfield <named list [5]> OK

āĻāĻ–āĻ¨ āĻ¤āĻžāĻĻā§‡āĻ° āĻ¸āĻ•āĻ˛ā§‡āĻ° āĻāĻ•āĻ‡ āĻ‰āĻĒāĻžāĻĻāĻžāĻ¨ āĻ°āĻ¯āĻŧā§‡āĻ›ā§‡, āĻ¯āĻž āĻŦā§āĻ¯āĻŦāĻšāĻžāĻ° āĻ•āĻ°ā§‡ āĻ¯āĻžāĻšāĻžāĻ‡ āĻ•āĻ°āĻž āĻ¯ā§‡āĻ¤ā§‡ āĻĒāĻžāĻ°ā§‡ unnest_wider():

loc %>%
  unnest_wider(json) %>% 
  unnest_longer(results) %>% 
  unnest_wider(results)
#> # A tibble: 5 x 7
#>   city   address_componenâ€Ļ formatted_addreâ€Ļ geometry place_id  types status
#>   <chr>  <list>            <chr>            <list>   <chr>     <lis> <chr> 
#> 1 Houstâ€Ļ <list [4]>        Houston, TX, USA <named â€Ļ ChIJAYWNâ€Ļ <lisâ€Ļ OK    
#> 2 LA     <list [4]>        Los Angeles, CAâ€Ļ <named â€Ļ ChIJE9onâ€Ļ <lisâ€Ļ OK    
#> 3 New Yâ€Ļ <list [3]>        New York, NY, Uâ€Ļ <named â€Ļ ChIJOwg_â€Ļ <lisâ€Ļ OK    
#> 4 Chicaâ€Ļ <list [4]>        Chicago, IL, USA <named â€Ļ ChIJ7cv0â€Ļ <lisâ€Ļ OK    
#> 5 Sprinâ€Ļ <list [5]>        Springfield, MOâ€Ļ <named â€Ļ ChIJP5jIâ€Ļ <lisâ€Ļ OK

āĻ¤āĻžāĻ˛āĻŋāĻ•āĻžāĻŸāĻŋ āĻĒā§āĻ°āĻ¸āĻžāĻ°āĻŋāĻ¤ āĻ•āĻ°ā§‡ āĻ†āĻŽāĻ°āĻž āĻĒā§āĻ°āĻ¤āĻŋāĻŸāĻŋ āĻļāĻšāĻ°ā§‡āĻ° āĻ…āĻ•ā§āĻˇāĻžāĻ‚āĻļ āĻāĻŦāĻ‚ āĻĻā§āĻ°āĻžāĻ˜āĻŋāĻŽāĻžāĻ‚āĻļā§‡āĻ° āĻ¸ā§āĻĨāĻžāĻ¨āĻžāĻ™ā§āĻ•āĻ—ā§āĻ˛āĻŋ āĻ–ā§āĻāĻœā§‡ āĻĒā§‡āĻ¤ā§‡ āĻĒāĻžāĻ°āĻŋ geometry:

loc %>%
  unnest_wider(json) %>% 
  unnest_longer(results) %>% 
  unnest_wider(results) %>% 
  unnest_wider(geometry)
#> # A tibble: 5 x 10
#>   city  address_componeâ€Ļ formatted_addreâ€Ļ bounds location location_type
#>   <chr> <list>           <chr>            <list> <list>   <chr>        
#> 1 Housâ€Ļ <list [4]>       Houston, TX, USA <nameâ€Ļ <named â€Ļ APPROXIMATE  
#> 2 LA    <list [4]>       Los Angeles, CAâ€Ļ <nameâ€Ļ <named â€Ļ APPROXIMATE  
#> 3 New â€Ļ <list [3]>       New York, NY, Uâ€Ļ <nameâ€Ļ <named â€Ļ APPROXIMATE  
#> 4 Chicâ€Ļ <list [4]>       Chicago, IL, USA <nameâ€Ļ <named â€Ļ APPROXIMATE  
#> 5 Spriâ€Ļ <list [5]>       Springfield, MOâ€Ļ <nameâ€Ļ <named â€Ļ APPROXIMATE  
#> # â€Ļ with 4 more variables: viewport <list>, place_id <chr>, types <list>,
#> #   status <chr>

āĻāĻŦāĻ‚ āĻ¤āĻžāĻ°āĻĒāĻ° āĻ…āĻŦāĻ¸ā§āĻĨāĻžāĻ¨ āĻ¯āĻžāĻ° āĻœāĻ¨ā§āĻ¯ āĻ†āĻĒāĻ¨āĻžāĻ•ā§‡ āĻĒā§āĻ°āĻ¸āĻžāĻ°āĻŋāĻ¤ āĻ•āĻ°āĻ¤ā§‡ āĻšāĻŦā§‡ location:

loc %>%
  unnest_wider(json) %>%
  unnest_longer(results) %>%
  unnest_wider(results) %>%
  unnest_wider(geometry) %>%
  unnest_wider(location)
#> # A tibble: 5 x 11
#>   city  address_componeâ€Ļ formatted_addreâ€Ļ bounds   lat    lng location_type
#>   <chr> <list>           <chr>            <list> <dbl>  <dbl> <chr>        
#> 1 Housâ€Ļ <list [4]>       Houston, TX, USA <nameâ€Ļ  29.8  -95.4 APPROXIMATE  
#> 2 LA    <list [4]>       Los Angeles, CAâ€Ļ <nameâ€Ļ  34.1 -118.  APPROXIMATE  
#> 3 New â€Ļ <list [3]>       New York, NY, Uâ€Ļ <nameâ€Ļ  40.7  -74.0 APPROXIMATE  
#> 4 Chicâ€Ļ <list [4]>       Chicago, IL, USA <nameâ€Ļ  41.9  -87.6 APPROXIMATE  
#> 5 Spriâ€Ļ <list [5]>       Springfield, MOâ€Ļ <nameâ€Ļ  37.2  -93.3 APPROXIMATE  
#> # â€Ļ with 4 more variables: viewport <list>, place_id <chr>, types <list>,
#> #   status <chr>

āĻ¤āĻŦā§āĻ“ āĻ†āĻŦāĻžāĻ°, unnest_auto() āĻ†āĻ—āĻ¤ āĻĄā§‡āĻŸāĻžāĻ° āĻ—āĻ āĻ¨ āĻĒāĻ°āĻŋāĻŦāĻ°ā§āĻ¤āĻ¨ā§‡āĻ° āĻ•āĻžāĻ°āĻŖā§‡ āĻšāĻ¤ā§‡ āĻĒāĻžāĻ°ā§‡ āĻāĻŽāĻ¨ āĻ•āĻŋāĻ›ā§ āĻā§āĻāĻ•āĻŋ āĻ¸āĻš āĻŦāĻ°ā§āĻŖāĻŋāĻ¤ āĻ…āĻĒāĻžāĻ°ā§‡āĻļāĻ¨āĻŸāĻŋāĻ•ā§‡ āĻ¸āĻšāĻœ āĻ•āĻ°ā§‡:

loc %>%
  unnest_auto(json) %>%
  unnest_auto(results) %>%
  unnest_auto(results) %>%
  unnest_auto(geometry) %>%
  unnest_auto(location)
#> Using `unnest_wider(json)`; elements have 2 names in common
#> Using `unnest_longer(results)`; no element has names
#> Using `unnest_wider(results)`; elements have 5 names in common
#> Using `unnest_wider(geometry)`; elements have 4 names in common
#> Using `unnest_wider(location)`; elements have 2 names in common
#> # A tibble: 5 x 11
#>   city  address_componeâ€Ļ formatted_addreâ€Ļ bounds   lat    lng location_type
#>   <chr> <list>           <chr>            <list> <dbl>  <dbl> <chr>        
#> 1 Housâ€Ļ <list [4]>       Houston, TX, USA <nameâ€Ļ  29.8  -95.4 APPROXIMATE  
#> 2 LA    <list [4]>       Los Angeles, CAâ€Ļ <nameâ€Ļ  34.1 -118.  APPROXIMATE  
#> 3 New â€Ļ <list [3]>       New York, NY, Uâ€Ļ <nameâ€Ļ  40.7  -74.0 APPROXIMATE  
#> 4 Chicâ€Ļ <list [4]>       Chicago, IL, USA <nameâ€Ļ  41.9  -87.6 APPROXIMATE  
#> 5 Spriâ€Ļ <list [5]>       Springfield, MOâ€Ļ <nameâ€Ļ  37.2  -93.3 APPROXIMATE  
#> # â€Ļ with 4 more variables: viewport <list>, place_id <chr>, types <list>,
#> #   status <chr>

āĻāĻ›āĻžāĻĄāĻŧāĻžāĻ“ āĻ†āĻŽāĻ°āĻž āĻĒā§āĻ°āĻ¤āĻŋāĻŸāĻŋ āĻļāĻšāĻ°ā§‡āĻ° āĻĒā§āĻ°āĻĨāĻŽ āĻ āĻŋāĻ•āĻžāĻ¨āĻž āĻĻā§‡āĻ–āĻ¤ā§‡ āĻĒāĻžāĻ°āĻŋ:

loc %>%
  unnest_wider(json) %>%
  hoist(results, first_result = 1) %>%
  unnest_wider(first_result) %>%
  unnest_wider(geometry) %>%
  unnest_wider(location)
#> # A tibble: 5 x 11
#>   city  address_componeâ€Ļ formatted_addreâ€Ļ bounds   lat    lng location_type
#>   <chr> <list>           <chr>            <list> <dbl>  <dbl> <chr>        
#> 1 Housâ€Ļ <list [4]>       Houston, TX, USA <nameâ€Ļ  29.8  -95.4 APPROXIMATE  
#> 2 LA    <list [4]>       Los Angeles, CAâ€Ļ <nameâ€Ļ  34.1 -118.  APPROXIMATE  
#> 3 New â€Ļ <list [3]>       New York, NY, Uâ€Ļ <nameâ€Ļ  40.7  -74.0 APPROXIMATE  
#> 4 Chicâ€Ļ <list [4]>       Chicago, IL, USA <nameâ€Ļ  41.9  -87.6 APPROXIMATE  
#> 5 Spriâ€Ļ <list [5]>       Springfield, MOâ€Ļ <nameâ€Ļ  37.2  -93.3 APPROXIMATE  
#> # â€Ļ with 4 more variables: viewport <list>, place_id <chr>, types <list>,
#> #   status <chr>

āĻ…āĻĨāĻŦāĻž āĻŦā§āĻ¯āĻŦāĻšāĻžāĻ° āĻ•āĻ°ā§āĻ¨ hoist() āĻāĻ•āĻŸāĻŋ āĻŽāĻžāĻ˛ā§āĻŸāĻŋ-āĻ˛ā§‡āĻ­ā§‡āĻ˛ āĻĄāĻžāĻ‡āĻ­ā§‡āĻ° āĻœāĻ¨ā§āĻ¯ āĻ¸āĻ°āĻžāĻ¸āĻ°āĻŋ āĻ¯ā§‡āĻ¤ā§‡ lat и lng.

loc %>%
  hoist(json,
    lat = list("results", 1, "geometry", "location", "lat"),
    lng = list("results", 1, "geometry", "location", "lng")
  )
#> # A tibble: 5 x 4
#>   city          lat    lng json            
#>   <chr>       <dbl>  <dbl> <list>          
#> 1 Houston      29.8  -95.4 <named list [2]>
#> 2 LA           34.1 -118.  <named list [2]>
#> 3 New York     40.7  -74.0 <named list [2]>
#> 4 Chicago      41.9  -87.6 <named list [2]>
#> 5 Springfield  37.2  -93.3 <named list [2]>

āĻļāĻžāĻ°ā§āĻ˛āĻž āĻ—ā§‡āĻ˛āĻĢāĻžāĻ¨ā§āĻĄā§‡āĻ° āĻĄāĻŋāĻ¸āĻ•ā§‹āĻ—ā§āĻ°āĻžāĻĢāĻŋ

āĻ…āĻŦāĻļā§‡āĻˇā§‡, āĻ†āĻŽāĻ°āĻž āĻ¸āĻŦāĻšā§‡āĻ¯āĻŧā§‡ āĻœāĻŸāĻŋāĻ˛ āĻ•āĻžāĻ āĻžāĻŽā§‹ āĻĻā§‡āĻ–āĻŦ - āĻļāĻžāĻ°ā§āĻ˛āĻž āĻ—ā§‡āĻ˛āĻĢāĻžāĻ¨ā§āĻĄā§‡āĻ° āĻĄāĻŋāĻ¸āĻ•ā§‹āĻ—ā§āĻ°āĻžāĻĢāĻŋāĨ¤ āĻ‰āĻĒāĻ°ā§‡āĻ° āĻ‰āĻĻāĻžāĻšāĻ°āĻŖāĻ—ā§āĻ˛āĻŋāĻ° āĻŽāĻ¤ā§‹, āĻ†āĻŽāĻ°āĻž āĻ¤āĻžāĻ˛āĻŋāĻ•āĻžāĻŸāĻŋāĻ•ā§‡ āĻāĻ•āĻŸāĻŋ āĻāĻ•āĻ•-āĻ•āĻ˛āĻžāĻŽ āĻĄā§‡āĻŸāĻž āĻĢā§āĻ°ā§‡āĻŽā§‡ āĻ°ā§‚āĻĒāĻžāĻ¨ā§āĻ¤āĻ° āĻ•āĻ°ā§‡ āĻļā§āĻ°ā§ āĻ•āĻ°āĻŋ āĻāĻŦāĻ‚ āĻ¤āĻžāĻ°āĻĒāĻ° āĻāĻŸāĻŋāĻ•ā§‡ āĻĒā§āĻ°āĻ¸āĻžāĻ°āĻŋāĻ¤ āĻ•āĻ°āĻŋ āĻ¯āĻžāĻ¤ā§‡ āĻĒā§āĻ°āĻ¤āĻŋāĻŸāĻŋ āĻ‰āĻĒāĻžāĻĻāĻžāĻ¨ āĻāĻ•āĻŸāĻŋ āĻĒā§ƒāĻĨāĻ• āĻ•āĻ˛āĻžāĻŽ āĻšāĻ¯āĻŧāĨ¤ āĻāĻ›āĻžāĻĄāĻŧāĻžāĻ“ āĻ†āĻŽāĻŋ āĻ•āĻ˛āĻžāĻŽ āĻ°ā§‚āĻĒāĻžāĻ¨ā§āĻ¤āĻ° date_added R-āĻ āĻ‰āĻĒāĻ¯ā§āĻ•ā§āĻ¤ āĻ¤āĻžāĻ°āĻŋāĻ– āĻāĻŦāĻ‚ āĻ¸āĻŽāĻ¯āĻŧ āĻŦāĻŋāĻ¨ā§āĻ¯āĻžāĻ¸ā§‡āĨ¤

discs <- tibble(disc = discog) %>% 
  unnest_wider(disc) %>% 
  mutate(date_added = as.POSIXct(strptime(date_added, "%Y-%m-%dT%H:%M:%S"))) 
discs
#> # A tibble: 155 x 5
#>    instance_id date_added          basic_information       id rating
#>          <int> <dttm>              <list>               <int>  <int>
#>  1   354823933 2019-02-16 17:48:59 <named list [11]>  7496378      0
#>  2   354092601 2019-02-13 14:13:11 <named list [11]>  4490852      0
#>  3   354091476 2019-02-13 14:07:23 <named list [11]>  9827276      0
#>  4   351244906 2019-02-02 11:39:58 <named list [11]>  9769203      0
#>  5   351244801 2019-02-02 11:39:37 <named list [11]>  7237138      0
#>  6   351052065 2019-02-01 20:40:53 <named list [11]> 13117042      0
#>  7   350315345 2019-01-29 15:48:37 <named list [11]>  7113575      0
#>  8   350315103 2019-01-29 15:47:22 <named list [11]> 10540713      0
#>  9   350314507 2019-01-29 15:44:08 <named list [11]> 11260950      0
#> 10   350314047 2019-01-29 15:41:35 <named list [11]> 11726853      0
#> # â€Ļ with 145 more rows

āĻāĻ‡ āĻ¸ā§āĻ¤āĻ°ā§‡, āĻļāĻžāĻ°ā§āĻ˛āĻžāĻ° āĻĄāĻŋāĻ¸ā§āĻ•ā§‹āĻ—ā§āĻ°āĻžāĻĢāĻŋāĻ¤ā§‡ āĻĒā§āĻ°āĻ¤āĻŋāĻŸāĻŋ āĻĄāĻŋāĻ¸ā§āĻ• āĻ•āĻ–āĻ¨ āĻ¯ā§‹āĻ— āĻ•āĻ°āĻž āĻšāĻ¯āĻŧā§‡āĻ›āĻŋāĻ˛ āĻ¸ā§‡ āĻ¸āĻŽā§āĻĒāĻ°ā§āĻ•ā§‡ āĻ†āĻŽāĻ°āĻž āĻ¤āĻĨā§āĻ¯ āĻĒāĻžāĻ‡, āĻ•āĻŋāĻ¨ā§āĻ¤ā§ āĻ†āĻŽāĻ°āĻž āĻ¸ā§‡āĻ‡ āĻĄāĻŋāĻ¸ā§āĻ•āĻ—ā§āĻ˛āĻŋ āĻ¸āĻŽā§āĻĒāĻ°ā§āĻ•ā§‡ āĻ•ā§‹āĻ¨āĻ“ āĻĄā§‡āĻŸāĻž āĻĻā§‡āĻ–āĻ¤ā§‡ āĻĒāĻžāĻ‡ āĻ¨āĻžāĨ¤ āĻāĻŸāĻŋ āĻ•āĻ°āĻžāĻ° āĻœāĻ¨ā§āĻ¯ āĻ†āĻŽāĻžāĻĻā§‡āĻ° āĻ•āĻ˛āĻžāĻŽāĻŸāĻŋ āĻĒā§āĻ°āĻ¸āĻžāĻ°āĻŋāĻ¤ āĻ•āĻ°āĻ¤ā§‡ āĻšāĻŦā§‡ basic_information:

discs %>% unnest_wider(basic_information)
#> Column name `id` must not be duplicated.
#> Use .name_repair to specify repair.

āĻĻā§āĻ°ā§āĻ­āĻžāĻ—ā§āĻ¯āĻŦāĻļāĻ¤, āĻ†āĻŽāĻ°āĻž āĻāĻ•āĻŸāĻŋ āĻ¤ā§āĻ°ā§āĻŸāĻŋ āĻĒāĻžāĻŦ, āĻ•āĻžāĻ°āĻŖ... āĻ¤āĻžāĻ˛āĻŋāĻ•āĻžāĻ° āĻ­āĻŋāĻ¤āĻ°ā§‡ basic_information āĻāĻ•āĻ‡ āĻ¨āĻžāĻŽā§‡āĻ° āĻāĻ•āĻŸāĻŋ āĻ•āĻ˛āĻžāĻŽ āĻ†āĻ›ā§‡ basic_information. āĻ¯āĻĻāĻŋ āĻāĻ‡ āĻ§āĻ°āĻ¨ā§‡āĻ° āĻāĻ•āĻŸāĻŋ āĻ¤ā§āĻ°ā§āĻŸāĻŋ āĻ˜āĻŸā§‡, āĻĻā§āĻ°ā§āĻ¤ āĻāĻ° āĻ•āĻžāĻ°āĻŖ āĻ¨āĻŋāĻ°ā§āĻ§āĻžāĻ°āĻŖ āĻ•āĻ°āĻžāĻ° āĻœāĻ¨ā§āĻ¯, āĻ†āĻĒāĻ¨āĻŋ āĻŦā§āĻ¯āĻŦāĻšāĻžāĻ° āĻ•āĻ°āĻ¤ā§‡ āĻĒāĻžāĻ°ā§‡āĻ¨ names_repair = "unique":

discs %>% unnest_wider(basic_information, names_repair = "unique")
#> New names:
#> * id -> id...6
#> * id -> id...14
#> # A tibble: 155 x 15
#>    instance_id date_added          labels  year artists id...6 thumb title
#>          <int> <dttm>              <list> <int> <list>   <int> <chr> <chr>
#>  1   354823933 2019-02-16 17:48:59 <listâ€Ļ  2015 <list â€Ļ 7.50e6 httpâ€Ļ Demo 
#>  2   354092601 2019-02-13 14:13:11 <listâ€Ļ  2013 <list â€Ļ 4.49e6 httpâ€Ļ Obseâ€Ļ
#>  3   354091476 2019-02-13 14:07:23 <listâ€Ļ  2017 <list â€Ļ 9.83e6 httpâ€Ļ I    
#>  4   351244906 2019-02-02 11:39:58 <listâ€Ļ  2017 <list â€Ļ 9.77e6 httpâ€Ļ Oídoâ€Ļ
#>  5   351244801 2019-02-02 11:39:37 <listâ€Ļ  2015 <list â€Ļ 7.24e6 httpâ€Ļ A Caâ€Ļ
#>  6   351052065 2019-02-01 20:40:53 <listâ€Ļ  2019 <list â€Ļ 1.31e7 httpâ€Ļ Tashâ€Ļ
#>  7   350315345 2019-01-29 15:48:37 <listâ€Ļ  2014 <list â€Ļ 7.11e6 httpâ€Ļ Demo 
#>  8   350315103 2019-01-29 15:47:22 <listâ€Ļ  2015 <list â€Ļ 1.05e7 httpâ€Ļ Let â€Ļ
#>  9   350314507 2019-01-29 15:44:08 <listâ€Ļ  2017 <list â€Ļ 1.13e7 ""    Sub â€Ļ
#> 10   350314047 2019-01-29 15:41:35 <listâ€Ļ  2017 <list â€Ļ 1.17e7 httpâ€Ļ Demo 
#> # â€Ļ with 145 more rows, and 7 more variables: formats <list>,
#> #   cover_image <chr>, resource_url <chr>, master_id <int>,
#> #   master_url <chr>, id...14 <int>, rating <int>

āĻ¸āĻŽāĻ¸ā§āĻ¯āĻž āĻšāĻ˛ āĻ¯ā§‡ basic_information āĻ†āĻ‡āĻĄāĻŋ āĻ•āĻ˛āĻžāĻŽā§‡āĻ° āĻĒā§āĻ¨āĻ°āĻžāĻŦā§ƒāĻ¤ā§āĻ¤āĻŋ āĻ•āĻ°ā§‡ āĻ¯āĻž āĻ‰āĻĒāĻ°ā§‡āĻ° āĻ¸ā§āĻ¤āĻ°ā§‡āĻ“ āĻ¸āĻ‚āĻ°āĻ•ā§āĻˇāĻŋāĻ¤ āĻĨāĻžāĻ•ā§‡, āĻ¤āĻžāĻ‡ āĻ†āĻŽāĻ°āĻž āĻāĻŸāĻŋāĻ•ā§‡ āĻ¸āĻ°āĻžāĻ¤ā§‡ āĻĒāĻžāĻ°āĻŋ:

discs %>% 
  select(-id) %>% 
  unnest_wider(basic_information)
#> # A tibble: 155 x 14
#>    instance_id date_added          labels  year artists     id thumb title
#>          <int> <dttm>              <list> <int> <list>   <int> <chr> <chr>
#>  1   354823933 2019-02-16 17:48:59 <listâ€Ļ  2015 <list â€Ļ 7.50e6 httpâ€Ļ Demo 
#>  2   354092601 2019-02-13 14:13:11 <listâ€Ļ  2013 <list â€Ļ 4.49e6 httpâ€Ļ Obseâ€Ļ
#>  3   354091476 2019-02-13 14:07:23 <listâ€Ļ  2017 <list â€Ļ 9.83e6 httpâ€Ļ I    
#>  4   351244906 2019-02-02 11:39:58 <listâ€Ļ  2017 <list â€Ļ 9.77e6 httpâ€Ļ Oídoâ€Ļ
#>  5   351244801 2019-02-02 11:39:37 <listâ€Ļ  2015 <list â€Ļ 7.24e6 httpâ€Ļ A Caâ€Ļ
#>  6   351052065 2019-02-01 20:40:53 <listâ€Ļ  2019 <list â€Ļ 1.31e7 httpâ€Ļ Tashâ€Ļ
#>  7   350315345 2019-01-29 15:48:37 <listâ€Ļ  2014 <list â€Ļ 7.11e6 httpâ€Ļ Demo 
#>  8   350315103 2019-01-29 15:47:22 <listâ€Ļ  2015 <list â€Ļ 1.05e7 httpâ€Ļ Let â€Ļ
#>  9   350314507 2019-01-29 15:44:08 <listâ€Ļ  2017 <list â€Ļ 1.13e7 ""    Sub â€Ļ
#> 10   350314047 2019-01-29 15:41:35 <listâ€Ļ  2017 <list â€Ļ 1.17e7 httpâ€Ļ Demo 
#> # â€Ļ with 145 more rows, and 6 more variables: formats <list>,
#> #   cover_image <chr>, resource_url <chr>, master_id <int>,
#> #   master_url <chr>, rating <int>

āĻŦāĻŋāĻ•āĻ˛ā§āĻĒāĻ­āĻžāĻŦā§‡, āĻ†āĻŽāĻ°āĻž āĻŦā§āĻ¯āĻŦāĻšāĻžāĻ° āĻ•āĻ°āĻ¤ā§‡ āĻĒāĻžāĻ°ā§‡ hoist():

discs %>% 
  hoist(basic_information,
    title = "title",
    year = "year",
    label = list("labels", 1, "name"),
    artist = list("artists", 1, "name")
  )
#> # A tibble: 155 x 9
#>    instance_id date_added          title  year label artist
#>          <int> <dttm>              <chr> <int> <chr> <chr> 
#>  1   354823933 2019-02-16 17:48:59 Demo   2015 Tobiâ€Ļ Mollot
#>  2   354092601 2019-02-13 14:13:11 Obseâ€Ļ  2013 La Vâ€Ļ Una Bâ€Ļ
#>  3   354091476 2019-02-13 14:07:23 I      2017 La Vâ€Ļ S.H.Iâ€Ļ
#>  4   351244906 2019-02-02 11:39:58 Oídoâ€Ļ  2017 La Vâ€Ļ Rata â€Ļ
#>  5   351244801 2019-02-02 11:39:37 A Caâ€Ļ  2015 Katoâ€Ļ Ivy (â€Ļ
#>  6   351052065 2019-02-01 20:40:53 Tashâ€Ļ  2019 Highâ€Ļ Tashme
#>  7   350315345 2019-01-29 15:48:37 Demo   2014 Mindâ€Ļ Desgrâ€Ļ
#>  8   350315103 2019-01-29 15:47:22 Let â€Ļ  2015 Not â€Ļ Phantâ€Ļ
#>  9   350314507 2019-01-29 15:44:08 Sub â€Ļ  2017 Not â€Ļ Sub Sâ€Ļ
#> 10   350314047 2019-01-29 15:41:35 Demo   2017 Presâ€Ļ Smallâ€Ļ
#> # â€Ļ with 145 more rows, and 3 more variables: basic_information <list>,
#> #   id <int>, rating <int>

āĻāĻ–āĻžāĻ¨ā§‡ āĻ†āĻŽāĻŋ āĻ¨ā§‡āĻ¸ā§āĻŸā§‡āĻĄ āĻ¤āĻžāĻ˛āĻŋāĻ•āĻžāĻ¯āĻŧ āĻĄā§āĻŦ āĻĻāĻŋāĻ¯āĻŧā§‡ āĻ¸ā§‚āĻšā§€ āĻ…āĻ¨ā§āĻ¸āĻžāĻ°ā§‡ āĻĒā§āĻ°āĻĨāĻŽ āĻ˛ā§‡āĻŦā§‡āĻ˛ āĻāĻŦāĻ‚ āĻļāĻŋāĻ˛ā§āĻĒā§€āĻ° āĻ¨āĻžāĻŽ āĻĻā§āĻ°ā§āĻ¤ āĻĒā§āĻ¨āĻ°ā§āĻĻā§āĻ§āĻžāĻ° āĻ•āĻ°āĻŋāĨ¤

āĻļāĻŋāĻ˛ā§āĻĒā§€ āĻāĻŦāĻ‚ āĻ˛ā§‡āĻŦā§‡āĻ˛ā§‡āĻ° āĻœāĻ¨ā§āĻ¯ āĻĒā§ƒāĻĨāĻ• āĻŸā§‡āĻŦāĻŋāĻ˛ āĻ¤ā§ˆāĻ°āĻŋ āĻ•āĻ°āĻž āĻ†āĻ°āĻ“ āĻ¨āĻŋāĻ¯āĻŧāĻŽāĻ¤āĻžāĻ¨ā§āĻ¤ā§āĻ°āĻŋāĻ• āĻĒāĻĻā§āĻ§āĻ¤āĻŋāĻ°:

discs %>% 
  hoist(basic_information, artist = "artists") %>% 
  select(disc_id = id, artist) %>% 
  unnest_longer(artist) %>% 
  unnest_wider(artist)
#> # A tibble: 167 x 8
#>     disc_id join  name        anv   tracks role  resource_url            id
#>       <int> <chr> <chr>       <chr> <chr>  <chr> <chr>                <int>
#>  1  7496378 ""    Mollot      ""    ""     ""    https://api.discogâ€Ļ 4.62e6
#>  2  4490852 ""    Una Bèstiaâ€Ļ ""    ""     ""    https://api.discogâ€Ļ 3.19e6
#>  3  9827276 ""    S.H.I.T. (â€Ļ ""    ""     ""    https://api.discogâ€Ļ 2.77e6
#>  4  9769203 ""    Rata Negra  ""    ""     ""    https://api.discogâ€Ļ 4.28e6
#>  5  7237138 ""    Ivy (18)    ""    ""     ""    https://api.discogâ€Ļ 3.60e6
#>  6 13117042 ""    Tashme      ""    ""     ""    https://api.discogâ€Ļ 5.21e6
#>  7  7113575 ""    Desgraciadâ€Ļ ""    ""     ""    https://api.discogâ€Ļ 4.45e6
#>  8 10540713 ""    Phantom Heâ€Ļ ""    ""     ""    https://api.discogâ€Ļ 4.27e6
#>  9 11260950 ""    Sub Space â€Ļ ""    ""     ""    https://api.discogâ€Ļ 5.69e6
#> 10 11726853 ""    Small Man â€Ļ ""    ""     ""    https://api.discogâ€Ļ 6.37e6
#> # â€Ļ with 157 more rows

discs %>% 
  hoist(basic_information, format = "formats") %>% 
  select(disc_id = id, format) %>% 
  unnest_longer(format) %>% 
  unnest_wider(format) %>% 
  unnest_longer(descriptions)
#> # A tibble: 280 x 5
#>     disc_id descriptions text  name     qty  
#>       <int> <chr>        <chr> <chr>    <chr>
#>  1  7496378 Numbered     Black Cassette 1    
#>  2  4490852 LP           <NA>  Vinyl    1    
#>  3  9827276 "7""        <NA>  Vinyl    1    
#>  4  9827276 45 RPM       <NA>  Vinyl    1    
#>  5  9827276 EP           <NA>  Vinyl    1    
#>  6  9769203 LP           <NA>  Vinyl    1    
#>  7  9769203 Album        <NA>  Vinyl    1    
#>  8  7237138 "7""        <NA>  Vinyl    1    
#>  9  7237138 45 RPM       <NA>  Vinyl    1    
#> 10 13117042 "7""        <NA>  Vinyl    1    
#> # â€Ļ with 270 more rows

āĻ¤āĻžāĻ°āĻĒāĻ°ā§‡ āĻ†āĻĒāĻ¨āĻŋ āĻĒā§āĻ°āĻ¯āĻŧā§‹āĻœāĻ¨ āĻ…āĻ¨ā§āĻ¸āĻžāĻ°ā§‡ āĻŽā§‚āĻ˛ āĻĄā§‡āĻŸāĻžāĻ¸ā§‡āĻŸā§‡ āĻ¤āĻžāĻĻā§‡āĻ° āĻ¸āĻžāĻĨā§‡ āĻ¯ā§‹āĻ— āĻĻāĻŋāĻ¤ā§‡ āĻĒāĻžāĻ°ā§‡āĻ¨āĨ¤

āĻ‰āĻĒāĻ¸āĻ‚āĻšāĻžāĻ°

āĻ—ā§āĻ°āĻ¨ā§āĻĨāĻžāĻ—āĻžāĻ°ā§‡āĻ° āĻŽā§‚āĻ˛ āĻ…āĻ‚āĻļā§‡ tidyverse āĻāĻ•āĻŸāĻŋ āĻ¸āĻžāĻ§āĻžāĻ°āĻŖ āĻĄā§‡āĻŸāĻž āĻĒā§āĻ°āĻ¸ā§‡āĻ¸āĻŋāĻ‚ āĻĻāĻ°ā§āĻļāĻ¨ āĻĻā§āĻŦāĻžāĻ°āĻž āĻāĻ•āĻ¤ā§āĻ°āĻŋāĻ¤ āĻ…āĻ¨ā§‡āĻ• āĻĻāĻ°āĻ•āĻžāĻ°ā§€ āĻĒā§āĻ¯āĻžāĻ•ā§‡āĻœ āĻ…āĻ¨ā§āĻ¤āĻ°ā§āĻ­ā§āĻ•ā§āĻ¤āĨ¤

āĻāĻ‡ āĻ¨āĻŋāĻŦāĻ¨ā§āĻ§ā§‡ āĻ†āĻŽāĻ°āĻž āĻĢāĻžāĻ‚āĻļāĻ¨ āĻĒāĻ°āĻŋāĻŦāĻžāĻ° āĻĒāĻ°ā§€āĻ•ā§āĻˇāĻž unnest_*(), āĻ¯āĻž āĻ¨ā§‡āĻ¸ā§āĻŸā§‡āĻĄ āĻ¤āĻžāĻ˛āĻŋāĻ•āĻž āĻĨā§‡āĻ•ā§‡ āĻ‰āĻĒāĻžāĻĻāĻžāĻ¨ āĻ¨āĻŋāĻˇā§āĻ•āĻžāĻļāĻ¨ā§‡āĻ° āĻ¸āĻžāĻĨā§‡ āĻ•āĻžāĻœ āĻ•āĻ°āĻžāĻ° āĻ˛āĻ•ā§āĻˇā§āĻ¯ā§‡āĨ¤ āĻāĻ‡ āĻĒā§āĻ¯āĻžāĻ•ā§‡āĻœāĻŸāĻŋāĻ¤ā§‡ āĻ†āĻ°āĻ“ āĻ…āĻ¨ā§‡āĻ• āĻĻāĻ°āĻ•āĻžāĻ°ā§€ āĻŦā§ˆāĻļāĻŋāĻˇā§āĻŸā§āĻ¯ āĻ°āĻ¯āĻŧā§‡āĻ›ā§‡ āĻ¯āĻž āĻ§āĻžāĻ°āĻŖāĻž āĻ…āĻ¨ā§āĻ¸āĻžāĻ°ā§‡ āĻĄā§‡āĻŸāĻž āĻ°ā§‚āĻĒāĻžāĻ¨ā§āĻ¤āĻ° āĻ•āĻ°āĻž āĻ¸āĻšāĻœ āĻ•āĻ°ā§‡ āĻ¤ā§‹āĻ˛ā§‡ āĻĒāĻ°āĻŋāĻĒāĻžāĻŸāĻŋ āĻĄā§‡āĻŸāĻž.

āĻ‰āĻ¤ā§āĻ¸: www.habr.com

āĻāĻ•āĻŸāĻŋ āĻŽāĻ¨ā§āĻ¤āĻŦā§āĻ¯ āĻœā§āĻĄāĻŧā§āĻ¨