Преобразовать фрейм данных даты

#r #dataframe #reformat

#r #фрейм данных #переформатировать

Вопрос:

У меня есть фрейм данных, который выглядит примерно так:

 County    2020-01-22  2020-01-23  2020-01-24
Autauga   0           1           0
Baldwin   0           2           4
Barbour   0           3           1
  

Тем не менее, я хотел бы переформатировать его так, чтобы я получал количество в день по округам. Что-то вроде этого:

 County   year  month  day  value 
Autauga  2020  01     22   0
Baldwin  2020  01     22   0
Barbour  2020  01     22   0
Autauga  2020  01     23   1
Baldwin  2020  01     23   2
Barbour  2020  01     23   3
Autauga  2020  01     24   0
Baldwin  2020  01     24   4
Barbour  2020  01     24   1
  

Ответ №1:

Мы могли бы использовать просто pivot_longer и указать names_sep

 library(tidyr)
pivot_longer(df1, cols = -County, 
     names_to = c("year", "month", "day"), names_sep = "-")
  

-вывод

 # A tibble: 9 x 5
#  County  year  month day   value
#  <chr>   <chr> <chr> <chr> <int>
#1 Autauga 2020  01    22        0
#2 Autauga 2020  01    23        1
#3 Autauga 2020  01    24        0
#4 Baldwin 2020  01    22        0
#5 Baldwin 2020  01    23        2
#6 Baldwin 2020  01    24        4
#7 Barbour 2020  01    22        0
#8 Barbour 2020  01    23        3
#9 Barbour 2020  01    24        1
  

данные

 df1 <- structure(list(County = c("Autauga", "Baldwin", "Barbour"), 
       `2020-01-22` = c(0L, 
0L, 0L), `2020-01-23` = 1:3, `2020-01-24` = c(0L, 4L, 1L)), 
class = "data.frame", row.names = c(NA, 
-3L))
  

Ответ №2:

Работает ли это:

 library(dplyr)
library(tidyr)
df %>% pivot_longer(!County, names_to = 'date') %>% 
separate(date, into = c('year','month','day'), sep = '-') %>% arrange(day)
# A tibble: 9 x 5
  County  year  month day   value
  <chr>   <chr> <chr> <chr> <dbl>
1 Autauga 2020  01    22        0
2 Baldwin 2020  01    22        0
3 Barbour 2020  01    22        0
4 Autauga 2020  01    23        1
5 Baldwin 2020  01    23        2
6 Barbour 2020  01    23        3
7 Autauga 2020  01    24        0
8 Baldwin 2020  01    24        4
9 Barbour 2020  01    24        1
  

Комментарии:

1. Это работает, но когда я использую это для полного набора данных, я получаю следующее предупреждающее сообщение: Предупреждающее сообщение: ожидается 2 штуки. Дополнительные фрагменты отброшены в 189588 строках [1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15, 16, 17, 18, 19, 20, …].

2. Я думаю, что на самом деле было бы более практично немного обобщить данные и просто указать округ, год, месяц и значение. Я предполагаю, что все, что мне нужно сделать, это удалить спецификацию дня и изменить функцию arrange () на месяц?

3. @JoseAlfaro, если вам не нужен «день», вы можете просто отбросить его и не нужно упорядочивать. Я думаю, это будет упорядочено по округам.