สเปรดส่งคืนข้อผิดพลาดตัวระบุที่ซ้ำกันแม้ว่าจะมีแถวที่ไม่ซ้ำรวมอยู่ด้วยก็ตาม

ฉันมีดาต้าเฟรมต่อไปนี้:

       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 ร่วมกับ regex บางตัวโดยใช้ vars(matches(...)) :-) - person Tino; 22.01.2018
comment
ขอบคุณ @Tino และ Moody_Mudskipper นั่นทำงานได้อย่างสมบูรณ์แบบ ฉันเดาว่าฉันซับซ้อนเกินไปกับโค้ด - person zabada; 22.01.2018
comment
ใช่ มันเป็นเพียงเรื่องของรสนิยม ฉันเพิ่งถือโอกาสโฆษณาฟังก์ชันนี้ - person Moody_Mudskipper; 23.01.2018