การปรับรูปร่าง R ยาวเป็นกว้างด้วยตัวแปรหมวดหมู่

ฉันมีกรอบข้อมูลที่มีลักษณะดังต่อไปนี้ พร้อมด้วยปีและตัวระบุ ID รวมถึงตัวแปรหมวดหมู่จำนวนมาก (ค่าที่แสดงด้วยตัวพิมพ์ใหญ่ด้านล่าง):

Year   ID   Var1   Var2  Var3 ...

1996   1    A      A     B
1996   1    A      A     C
1996   2    B      A     D
1998   2    C      C     A
2000   3    D      D     D

เป้าหมายของฉันคือปรับเปลี่ยนรูปแบบนี้ให้เป็นรูปแบบกว้างตาม ID แต่ยังให้จำนวน ID ปี และมูลค่าด้วย ตัวอย่างเช่น:

ID    Var1_1996_A  Var1_1996_B  Var1_1996_C   Var1_1996_D ...

1     2            0            0             0
2     0            1            0             0
3     0            0            0             0

เป็นต้น สำหรับแต่ละตัวแปร ฉันค่อนข้างใหม่กับ R และไม่พบการดำเนินการที่คล้ายกันจากโพสต์ที่มีอยู่ (ขออภัยหากซ้ำกัน) มีใครรู้บ้างว่าวิธีที่ดีที่สุดในการบรรลุเป้าหมายนี้จะเป็นอย่างไร ฉันได้ลองใช้ tidyr::pivot_wider แล้ว แต่สามารถทราบวิธีต่อท้ายปีเท่านั้น แต่ไม่สามารถสร้างหมวดหมู่แยกกันสำหรับการตอบสนองของตัวแปรแต่ละตัว

df <- df %>%
    pivot_wider(names_from = year,
                values_from (Var1, Var2, Var3, Var4, Var5)

หากใครสามารถนำเสนอข้อมูลเชิงลึกที่จะได้รับการชื่นชมอย่างมาก


person tmako    schedule 07.05.2021    source แหล่งที่มา


คำตอบ (2)


รับข้อมูลในรูปแบบยาวก่อน:

library(tidyr)

df %>%
  pivot_longer(cols = starts_with('Var')) %>%
  pivot_wider(names_from = c(name, Year, value), values_from = name, 
              values_fn = length, values_fill = 0)

#     ID Var1_1996_A Var2_1996_A Var3_1996_B Var3_1996_C Var1_1996_B Var3_1996_D
#  <int>       <int>       <int>       <int>       <int>       <int>       <int>
#1     1           2           2           1           1           0           0
#2     2           0           1           0           0           1           1
#3     3           0           0           0           0           0           0
# … with 6 more variables: Var1_1998_C <int>, Var2_1998_C <int>,
#   Var3_1998_A <int>, Var1_2000_D <int>, Var2_2000_D <int>, Var3_2000_D <int>

ข้อมูล

df <- structure(list(Year = c(1996L, 1996L, 1996L, 1998L, 2000L), ID = c(1L, 
1L, 2L, 2L, 3L), Var1 = c("A", "A", "B", "C", "D"), Var2 = c("A", 
"A", "A", "C", "D"), Var3 = c("B", "C", "D", "A", "D")), 
class = "data.frame", row.names = c(NA, -5L))
person Ronak Shah    schedule 07.05.2021

หากคุณจะใช้ฐาน R:

xtabs(~ID+v, transform(cbind(df[1:2], stack(df, -(1:2))), v = paste(ind, Year, values, sep="_")))

 v
ID  Var1_1996_A Var1_1996_B Var1_1998_C Var1_2000_D Var2_1996_A Var2_1998_C Var2_2000_D Var3_1996_B Var3_1996_C Var3_1996_D Var3_1998_A Var3_2000_D
  1           2           0           0           0           2           0           0           1           1           0           0           0
  2           0           1           1           0           1           1           0           0           0           1           1           0
  3           0           0           0           1           0           0           1           0           0           0           0           1

แน่นอนว่าต้องแปลงเป็น data.frame คุณสามารถใช้: as.data.frame.matrix(...)

person Onyambu    schedule 07.05.2021