Tidy Data

Pivoting

Long to Wide Form

# explosions per country per year, 1990 onward, then widened
nuc_counts <- nuclear %>%
  filter(year >= 1990) %>%
  count(country, year)

nuc_wide <- nuc_counts %>%
  pivot_wider(names_from = year, values_from = n)
nuc_wide
## # A tibble: 7 × 9
##   country `1990` `1992` `1993` `1994` `1995` `1996` `1991` `1998`
##   <chr>    <int>  <int>  <int>  <int>  <int>  <int>  <int>  <int>
## 1 CHINA        2      2      1      2      2      2     NA     NA
## 2 FRANCE       6     NA     NA     NA      5      1      6     NA
## 3 INDIA       NA     NA     NA     NA     NA     NA     NA      2
## 4 PAKIST      NA     NA     NA     NA     NA     NA     NA      2
## 5 UK           1     NA     NA     NA     NA     NA      1     NA
## 6 USA          8      6     NA     NA     NA     NA      7     NA
## 7 USSR         1     NA     NA     NA     NA     NA     NA     NA

Wide to Long Form

nuc_long <- nuc_wide %>%
  pivot_longer(cols = -country,
               names_to = "year",
               values_to = "explosions")
nuc_long
## # A tibble: 56 × 3
##    country year  explosions
##    <chr>   <chr>      <int>
##  1 CHINA   1990           2
##  2 CHINA   1992           2
##  3 CHINA   1993           1
##  4 CHINA   1994           2
##  5 CHINA   1995           2
##  6 CHINA   1996           2
##  7 CHINA   1991          NA
##  8 CHINA   1998          NA
##  9 FRANCE  1990           6
## 10 FRANCE  1992          NA
## # ℹ 46 more rows

Separating and Uniting

Separate a Column/Unite Two Columns

# unite latitude and longitude into one column, then separate them again
nuc_united <- nuclear %>%
  select(id_no, country, latitude, longitude) %>%
  unite(col = "location", c(latitude, longitude), sep = "/")
nuc_united
## # A tibble: 2,051 × 3
##    id_no country location     
##    <dbl> <chr>   <chr>        
##  1 45001 USA     32.54/-105.57
##  2 45002 USA     34.23/132.27 
##  3 45003 USA     32.45/129.52 
##  4 46001 USA     11.35/165.2  
##  5 46002 USA     11.35/165.2  
##  6 48001 USA     11.3/162.15  
##  7 48002 USA     11.3/162.15  
##  8 48003 USA     11.3/162.15  
##  9 49001 USSR    48/76        
## 10 51001 USA     37/-116      
## # ℹ 2,041 more rows
nuc_sep <- nuc_united %>%
  separate(col = location, into = c("latitude", "longitude"),
           sep = "/", convert = TRUE)
nuc_sep
## # A tibble: 2,051 × 4
##    id_no country latitude longitude
##    <dbl> <chr>      <dbl>     <dbl>
##  1 45001 USA         32.5     -106.
##  2 45002 USA         34.2      132.
##  3 45003 USA         32.4      130.
##  4 46001 USA         11.4      165.
##  5 46002 USA         11.4      165.
##  6 48001 USA         11.3      162.
##  7 48002 USA         11.3      162.
##  8 48003 USA         11.3      162.
##  9 49001 USSR        48         76 
## 10 51001 USA         37       -116 
## # ℹ 2,041 more rows

Missing Values

# pivot_wider creates NAs where a country had no explosions that year
nuc_wide
## # A tibble: 7 × 9
##   country `1990` `1992` `1993` `1994` `1995` `1996` `1991` `1998`
##   <chr>    <int>  <int>  <int>  <int>  <int>  <int>  <int>  <int>
## 1 CHINA        2      2      1      2      2      2     NA     NA
## 2 FRANCE       6     NA     NA     NA      5      1      6     NA
## 3 INDIA       NA     NA     NA     NA     NA     NA     NA      2
## 4 PAKIST      NA     NA     NA     NA     NA     NA     NA      2
## 5 UK           1     NA     NA     NA     NA     NA      1     NA
## 6 USA          8      6     NA     NA     NA     NA      7     NA
## 7 USSR         1     NA     NA     NA     NA     NA     NA     NA
# complete() makes the missing country-year rows explicit
nuc_counts %>%
  complete(country, year, fill = list(n = 0))
## # A tibble: 56 × 3
##    country  year     n
##    <chr>   <dbl> <int>
##  1 CHINA    1990     2
##  2 CHINA    1991     0
##  3 CHINA    1992     2
##  4 CHINA    1993     1
##  5 CHINA    1994     2
##  6 CHINA    1995     2
##  7 CHINA    1996     2
##  8 CHINA    1998     0
##  9 FRANCE   1990     6
## 10 FRANCE   1991     6
## # ℹ 46 more rows
# fill() copies a value into the NAs around it
nuclear %>%
  select(country, year, depth) %>%
  arrange(country, year) %>%
  fill(depth, .direction = "up")
## # A tibble: 2,051 × 3
##    country  year depth
##    <chr>   <dbl> <dbl>
##  1 CHINA    1964     0
##  2 CHINA    1965     0
##  3 CHINA    1966     0
##  4 CHINA    1966     0
##  5 CHINA    1966     0
##  6 CHINA    1967     0
##  7 CHINA    1967     0
##  8 CHINA    1968     0
##  9 CHINA    1969     0
## 10 CHINA    1969     0
## # ℹ 2,041 more rows

Non_Tidy Data