Как разделить фрейм данных на несколько фреймов данных по индексу столбца

#r

#r

Вопрос:

Я пытаюсь обработать данные о погоде, указанные ниже. Я думал, что я на правильном пути, но pivot_longer не используется в правильном manor и вызывает частичные дубликаты.

Может ли кто-нибудь предложить какие-либо предложения относительно того, как я могу отредактировать свой код? Я предполагаю, что одним из способов было бы выполнить pivot_longer после разделения фрейма данных на несколько фреймов данных, т.Е. Первый фрейм данных — январь, год, второй фрейм данных — февраль, год.

 maxT <- read.table('https://www.metoffice.gov.uk/pub/data/weather/uk/climate/datasets/Tmax/ranked/England_S.txt',  skip = 5, header = TRUE) %>%
  select(c(1:24)) %>%
  pivot_longer(cols = seq(2,24,2) , values_to = "year") %>%
  mutate_at(c(1:12), ~as.numeric(as.character(.))) %>%
  pivot_longer(cols = c(1:12), names_to = "month", values_to = "tmax") %>%
  mutate(month = match(str_to_title(month), month.abb),
         date = as.Date(paste(year, month, 1, sep = "-"), format = "%Y-%m-%d")) %>%
  select(-c("name","year","month")) %>%
  arrange(date)
  

Ответ №1:

Вот вариант с tidyverse использованием map2

 library(dplyr)
library(purrr)
list_df <- maxT %>% 
     select(seq(1, ncol(.), by = 2)) %>%
     map2(maxT %>% 
           select(seq(2, ncol(.), by = 2)), bind_cols) %>%
     imap( ~ .x %>% 
              rename(!! .y := `...1`, year = `...2`))
  

-вывод

 map(list_df, head)
#$jan
# A tibble: 6 x 2
#    jan  year
#  <dbl> <int>
#1   9.9  1916
#2   9.8  2007
#3   9.7  1921
#4   9.7  2008
#5   9.5  1990
#6   9.4  1975

#$feb
# A tibble: 6 x 2
#    feb  year
#  <dbl> <int>
#1  11.2  2019
#2  10.7  1998
#3  10.7  1990
#4  10.3  2002
#5  10.3  1945
#6  10    2020
# ...
  

данные

 maxT <- read.table('https://www.metoffice.gov.uk/pub/data/weather/uk/climate/datasets/Tmax/ranked/England_S.txt',  skip = 5, header = TRUE) %>%      
        select(c(1:24)) 
  

Ответ №2:

Мы можем использовать split.default для разделения группы из 2 столбцов.

 list_df <- split.default(maxT, ceiling(seq_along(maxT)/2))
  

данные

 maxT <- read.table('https://www.metoffice.gov.uk/pub/data/weather/uk/climate/datasets/Tmax/ranked/England_S.txt',  skip = 5, header = TRUE) %>%
  select(c(1:24))