Распространение с дубликатами идентификаторов для строк

До этого здесь были вопросы по этой теме, но я все еще борюсь с распространением этого. Я бы хотел, чтобы каждый state иметь собственный столбец значений температуры.

Вот dput() из моих данных. Я позвоню df

structure(list(date = c("2018-01-21", "2018-01-21", "2018-01-20", 
"2018-01-20", "2018-01-19", "2018-01-19", "2018-01-18", "2018-01-18", 
"2018-01-17", "2018-01-17", "2018-01-16", "2018-01-16", "2018-01-15", 
"2018-01-15", "2018-01-14", "2018-01-14", "2018-01-12", "2018-01-12", 
"2018-01-11", "2018-01-11", "2018-01-10", "2018-01-10", "2018-01-09", 
"2018-01-09", "2018-01-08", "2018-01-08", "2018-01-07", "2018-01-07", 
"2018-01-06", "2018-01-06", "2018-01-05", "2018-01-05", "2018-01-04", 
"2018-01-04", "2018-01-03", "2018-01-03", "2018-01-03", "2018-01-03", 
"2018-01-02", "2018-01-02"), tmin = c(24, 31, 31, 29, 44, 17, 
32, 7, 31, 7, 31, 6, 30, 13, 30, 1, 43, 20, 33, 52, 42, 29, 30, 
29, 26, 32, 33, -2, 29, 0, 23, 3, 19, 11, NA, -3, 22, -3, 24, 
-4), state = c("UT", "OH", "UT", "OH", "UT", "OH", "UT", "OH", 
"UT", "OH", "UT", "OH", "UT", "OH", "UT", "OH", "UT", "OH", "UT", 
"OH", "UT", "OH", "UT", "OH", "UT", "OH", "UT", "OH", "UT", "OH", 
"UT", "OH", "UT", "OH", "UT", "OH", "UT", "OH", "UT", "OH")), class = "data.frame", row.names = c(NA, 
-40L), .Names = c("date", "tmin", "state"))

Код, который я запускаю

df %>% spread(state,tmin)

который я ожидал дать мне следующий формат

date UT  OH
... ... ...

но я получаю сообщение об ошибке

Ошибка: повторяющиеся идентификаторы для строк (36, 38), (35, 37)

Я пробовал несколько разных вещей. Одна вещь, которую я попробовал, была группировка по дате. Я думал, что строки одной и той же даты вызывают проблемы для spread, Я также попытался создать новую строку с add_rownames() затем с помощью spread(state,tmin), но это также не решило проблему.

1 ответ

Решение

Для того чтобы spread чтобы работать как задумано, результирующий фрейм данных должен иметь уникально идентифицированные строки и столбцы. В случае ваших данных столбец "дата" является единственным уникальным идентификатором после распространения. Однако строки 36 и 38 идентичны:

         date tmin state
36 2018-01-03   -3    OH
38 2018-01-03   -3    OH

Это ставит тидир в невозможное положение, пытаясь разрешить две точки данных в одной строке и столбце. Кроме того, строки 35 и 37 имеют одинаковую дату и состояние, еще раз создавая невозможную ситуацию размещения двух разных значений в одной позиции в новом фрейме данных:

         date tmin state
35 2018-01-03   NA    UT
37 2018-01-03   22    UT

Следующая очистка данных сделает возможным распространение:

df %>% 
  filter(!is.na(tmin)) %>% # remove NA values
  unique %>% # remove duplicated rows
  spread(state, tmin)

         date OH UT
1  2018-01-02 -4 24
2  2018-01-03 -3 22
3  2018-01-04 11 19
4  2018-01-05  3 23
5  2018-01-06  0 29
...
Другие вопросы по тегам