Spread возвращает ошибку повторяющегося идентификатора даже с включенными уникальными строками

У меня есть следующий кадр данных:

       location asset_status count   row
      <chr>          <chr>  <dbl>  <int>
 1  location1        Owned     1     1
 2  location1    Available     1     2
 3  location1        Owned     1     3
 4  location2        Owned     1     4
 5  location2        Owned     1     5
 6  location2        Owned     1     6
 7  location2        Owned     1     7
 8  location2    no status     1     8
 9  location3        Owned     1     9
10  location3        Owned     1    10

Когда я пытаюсь распространить это, я получаю следующую ошибку:

df <- head(us_can_laptops,10) %>% 
  select(location,asset_status,count) %>% 
  #mutate(row = row_number()) %>% #excluded
  group_by(location) %>% 
  spread(asset_status,count)

Error: Duplicate identifiers for rows (4, 5, 6, 7), (1, 3)

Итак, что касается других вопросов, связанных с этим на SO, я добавил уникальный идентификатор с мутацией:

df <- head(us_can_laptops,10) %>% 
  select(location,asset_status,count) %>% 
  mutate(row = row_number()) %>%
  group_by(location) %>% 
  spread(asset_status,count)

Но это возвращает это:

    location     row   Available   `no status` Owned
 *        <chr> <int>     <dbl>       <dbl> <dbl>
 1  location2     4        NA          NA     1
 2  location2     5        NA          NA     1
 3  location2     6        NA          NA     1
 4  location2     7        NA          NA     1
 5  location2     8        NA           1    NA
 6  location3    10        NA          NA     1
 7  location3     9        NA          NA     1
 8  location1     1        NA          NA     1
 9  location1     2         1          NA    NA
10  location1     3        NA          NA     1

Кроме того, всякий раз, когда я пытаюсь выполнить вызов суммирования, это разрушает мой спред.

Вот желаемый результат:

 location        Available   `no status` Owned
 *      <chr>     <dbl>       <dbl>      <dbl>
 1  location1        1          NA        2
 2  location2       NA          1         4
 3  location3       NA          NA        2

Любая помощь будет оценена по достоинству. Я знаю, что это выглядит как дубликат, но ответы на следующие связанные вопросы по-прежнему не решают проблему для меня: Ошибка функции распространения: повторяющиеся идентификаторы для строк [дубликат] Разворот с повторяющимися идентификаторами для строк 1

Я действительно ищу решение при использовании dplyr, а не dcast


person zabada    schedule 22.01.2018    source источник
comment
Откуда в ожидаемом выводе значение 4 для строки в первой строке?   -  person Moody_Mudskipper    schedule 22.01.2018
comment
о, не обращайте внимания на столбец строки, пожалуйста. это просто счетчик. я удалю это в фактическом коде.   -  person zabada    schedule 22.01.2018


Ответы (1)


Следующее должно работать (по крайней мере, дает желаемый результат):

df <- structure(list(location = c("location1", "location1", "location1", 
                                  "location2", "location2", "location2", "location2", "location2", 
                                  "location3", "location3"), asset_status = c("Owned", "Available", 
                                                                              "Owned", "Owned", "Owned", "Owned", "Owned", "no status", "Owned", 
                                                                              "Owned"), count = c(1L, 1L, 1L, 1L, 1L, 1L, 1L, 1L, 1L, 1L), 
                     row = 1:10), row.names = c(NA, -10L), .Names = c("location", 
                                                                      "asset_status", "count", "row"), class = "data.frame")

library(dplyr)
library(tidyr)
df %>% 
  group_by(location, asset_status) %>% 
  summarise(count = sum(count)) %>% 
  spread(key = asset_status, value = count)
person Tino    schedule 22.01.2018
comment
Я публиковал то же самое, но вместо этого использовал summarize_at("count",sum), чтобы не повторять имя переменной :) - person Moody_Mudskipper; 22.01.2018
comment
Я часто забываю о summarise_at, когда мне просто нужно применить функцию только к одной переменной, а также немного отдаю предпочтение summarise-подходу, потому что я нахожу его более читабельным... но, возможно, это только я. Но мне очень нравится комбинировать summarise_at в сочетании с некоторым регулярным выражением, использующим vars(matches(...)) :-). - person Tino; 22.01.2018
comment
Спасибо @Tino и Moody_Mudskipper. Это сработало отлично. Наверное, я слишком усложнял код. - person zabada; 22.01.2018
comment
Да тут просто дело вкуса, я просто воспользовался возможностью прорекламировать функцию. - person Moody_Mudskipper; 23.01.2018