Ошибка Tidyr :: spread (): каждая строка вывода должна быть идентифицирована уникальной комбинацией клавиш - PullRequest
1 голос
/ 05 февраля 2020

Я изучаю тидир и выполняю небольшое упражнение для преобразования iris набора данных из широкого в длинный.

Исходный набор данных:

   Species Sepal.Length Sepal.Width Petal.Length Petal.Width
1  setosa          5.1         3.5          1.4         0.2
2  setosa          4.9         3.0          1.4         0.2
3  setosa          4.7         3.2          1.3         0.2
4  setosa          4.6         3.1          1.5         0.2
5  setosa          5.0         3.6          1.4         0.2
6  setosa          5.4         3.9          1.7         0.4

Полученный набор данных, который я хочу:

  Species  Part Length Width
1  setosa Petal    1.4   0.2
2  setosa Petal    1.4   0.2
3  setosa Petal    1.3   0.2
4  setosa Petal    1.5   0.2
5  setosa Petal    1.4   0.2
6  setosa Petal    1.7   0.4

Код, который я написал для управления набором данных:

iris_re <- iris[,c(5,1,2,3,4)]

iris.wide <- iris_re %>% 
  gather(key = "flower_att", value = "measurement",
         -Species) %>%
  separate(flower_att, into = c("Part","Method")) %>%
  spread(Method,measurement)

Но последняя строка spread() выдает ошибку:

Ошибка: каждая строка вывода должна быть идентифицирована уникальной комбинацией клавиш. Ключи разделены на 400 строк:

Я не ожидал, что это произойдет, и я все еще борюсь с этим. Спасибо!

1 Ответ

1 голос
/ 05 февраля 2020

Мы можем использовать pivot_longer из tidyr, который также может принимать несколько столбцов

library(dplyr)
library(tidyr)
iris_re %>%
  pivot_longer(cols = -Species, names_to = c("Part", ".value"), names_sep= "[.]") %>%
  head
#  Species  Part Length Width
#1  setosa Sepal    5.1   3.5
#2  setosa Petal    1.4   0.2
#3  setosa Sepal    4.9   3.0
#4  setosa Petal    1.4   0.2
#5  setosa Sepal    4.7   3.2
#6  setosa Petal    1.3   0.2

Ошибка в spread может возникать, когда существует более одной уникальной комбинации. С pivot_wider теперь он заменяется предупреждением и возвращает столбец list, если есть дубликаты, и тогда мы можем unnest. Или другой способ - создать столбец последовательности, сгруппированный по идентификатору столбца с дубликатами для создания уникального идентификатора строки, например

iris_re %>% 
  gather(key = "flower_att", value = "measurement",
         -Species) %>%
  separate(flower_att, into = c("Part","Method")) %>%
  group_by(Species, Part, Method) %>%
  mutate(rn = row_number()) %>% 
  ungroup %>%
  spread(Method,measurement)
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...