#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, если вам не нужен «день», вы можете просто отбросить его и не нужно упорядочивать. Я думаю, это будет упорядочено по округам.