Spread mengembalikan kesalahan pengidentifikasi duplikat bahkan dengan baris unik disertakan

Saya memiliki kerangka data berikut:

       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

Ketika saya mencoba menyebarkan menggunakan ini, saya mendapatkan kesalahan berikut:

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)

Jadi sesuai pertanyaan lain yang terkait dengan ini di SO, saya menambahkan pengidentifikasi unik dengan mutate:

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

Tapi itu mengembalikan ini:

    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

Selain itu, setiap kali saya mencoba panggilan ringkasan, penyebaran saya akan rusak.

Inilah hasil yang diinginkan:

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

Bantuan apa pun akan dihargai. Saya tahu ini tampak seperti duplikat, tetapi jawaban atas pertanyaan terkait berikut masih belum menyelesaikan masalah saya: Kesalahan fungsi penyebaran: Pengidentifikasi duplikat untuk baris [duplikat] Sebarkan dengan pengidentifikasi duplikat untuk baris 1

Saya benar-benar mencari solusi saat menggunakan dplyr, dan bukan dcast


person zabada    schedule 22.01.2018    source sumber
comment
Pada keluaran yang diharapkan, dari manakah nilai 4 untuk baris di baris pertama berasal?   -  person Moody_Mudskipper    schedule 22.01.2018
comment
oh tolong abaikan kolom baris. itu hanya konternya. saya akan menghapusnya dalam kode sebenarnya.   -  person zabada    schedule 22.01.2018


Jawaban (1)


Berikut ini seharusnya berfungsi (setidaknya memberikan hasil yang diinginkan):

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
Saya memposting hal yang sama, dengan summarize_at("count",sum) sebagai gantinya, untuk tidak mengulangi nama variabel :) - person Moody_Mudskipper; 22.01.2018
comment
Saya sering lupa tentang summarise_at ketika hanya harus menerapkan fungsi hanya pada satu variabel dan juga memiliki sedikit preferensi untuk pendekatan summarise karena Saya menganggapnya lebih mudah dibaca...tapi mungkin itu hanya saya. Tapi saya sangat suka menggabungkan summarise_at dalam kombinasi dengan beberapa regex menggunakan vars(matches(...)) :-). - person Tino; 22.01.2018
comment
Terima kasih @Tino dan Moody_Mudskipper. Itu bekerja dengan sempurna. Saya kira saya terlalu memperumit kodenya. - person zabada; 22.01.2018
comment
Ya, ini hanya masalah selera di sini, saya hanya memanfaatkan kesempatan ini untuk mengiklankan fungsinya. - person Moody_Mudskipper; 23.01.2018