r-多重选择问卷

r-多重选择问卷,r,dplyr,R,Dplyr,我有一个数据框,其中行是人,列是他们在多个选项问题中的回答方式: 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

我有一个数据框,其中行是人,列是他们在多个选项问题中的回答方式:

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

我试过使用
pivot\u-wider(df,names\u-from=c(问题1,问题2))
,但不起作用。有什么建议吗?

在转换为“宽”格式之前,我们可以将格式改为“长”格式

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(.)))
-输出

# 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
 
#一个tible:3 x 6
#人员q1_1 q1_2 q1_3 q2_1 q2_2
#        
#1 A 10 0 1 0
#2B00110
#3C010101

在base R中,您可以执行以下操作:

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
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