Saya memiliki kerangka data di mana baris adalah orang, dan kolom adalah bagaimana mereka merespons dalam beberapa pertanyaan opsi:

df <- data.frame(person = c("A", "B", "C"), question_1 = c(1, 3, 2), question_2 = c(1, 1, 2))
> df
  person question_1 question_2
1      A          1          1
2      B          3          1
3      C          2          2

Saya perlu pivot_wider tabel ini dengan cara berikut: setiap nilai tabel asli menjadi kolom, dan nilai tabel baru adalah apakah opsi itu dipilih (0 = tidak dipilih, 1 = dipilih). Hasil akhir akan terlihat seperti ini:

person q1_1 q1_2 q1_3 q2_1 q2_2
1      A    1    0    0    1    0
2      B    0    0    1    1    0
3      C    0    1    0    0    1
> 

Saya sudah mencoba dengan pivot_wider(df, names_from = c(question_1, question_2)), tetapi tidak berhasil. Ada saran?

2
NBK 13 Mei 2021, 04:31

2 jawaban

Jawaban Terbaik

Kita bisa membentuk kembali ke format 'panjang' sebelum mengonversi ke 'lebar

library(dplyr)
library(tidyr)
library(stringr)
df %>% 
  pivot_longer(cols = -person) %>%
  mutate(name = str_c('q', str_extract(name, "\\d"), "_", value), value = 1) %>% 
  pivot_wider(names_from = name, values_from = value, values_fill = 0) %>%
  select(gtools::mixedorder(names(.)))

-keluaran

# A tibble: 3 x 6
#  person  q1_1  q1_2  q1_3  q2_1  q2_2
#  <chr>  <dbl> <dbl> <dbl> <dbl> <dbl>
#1 A          1     0     0     1     0
#2 B          0     0     1     1     0
#3 C          0     1     0     0     1
 
3
akrun 13 Mei 2021, 01:41

Di basis R Anda bisa melakukan:

with(stack(df[-1]), table(cbind(df[1], q = sprintf("q%s_%d", gsub("\\D", "", ind), values))))

     q
person q1_1 q1_2 q1_3 q2_1 q2_2
     A    1    0    0    1    0
     B    0    0    1    1    0
     C    0    1    0    0    1
2
Onyambu 13 Mei 2021, 01:51