Membentuk kembali R panjang ke lebar dengan variabel kategori

Saya memiliki bingkai data seperti berikut, dengan pengidentifikasi tahun dan ID, serta banyak variabel kategori (nilai dilambangkan dengan huruf kapital di bawah):

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

Tujuan saya adalah membentuknya kembali menjadi format lebar berdasarkan ID, tetapi juga menghitung ID, tahun, dan nilai. Jadi, misalnya:

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

Begitu seterusnya untuk setiap variabel. Saya relatif baru mengenal R dan tidak dapat menemukan operasi serupa dari postingan yang ada (maaf jika ini duplikat). Adakah yang tahu cara terbaik untuk mencapai hal ini? Saya telah mencoba menggunakan tidyr::pivot_wider, tetapi hanya dapat mengetahui cara menambahkan tahun, tetapi tidak membuat kategori terpisah untuk setiap respons variabel

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

Jika ada yang bisa memberikan wawasan, itu akan sangat dihargai.


person tmako    schedule 07.05.2021    source sumber


Jawaban (2)


Dapatkan data dalam format panjang terlebih dahulu:

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>

data

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

Jika Anda akan menggunakan basis 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

Tentu saja untuk mengubahnya menjadi data.frame Anda dapat menggunakan: as.data.frame.matrix(...)

person Onyambu    schedule 07.05.2021