使用 pivot_wider 按响应选项扩展项目

Use pivot_wider to expand items by response options

我正在处理考试,我正在尝试获取每个项目的每个响应选项与测试总分的点双序列相关性。

为此,我想到了使用更宽的枢轴,这样我就可以从这样的东西扩展:

math_exam=data.frame(item1=c("a","b","a","c","d"),item2=c("b","b","c","c","a"))

  item1 item2 item3

1     a     b     b
2     b     b     c
3     a     c     a
4     c     c     c
5     d     a     d

进入更像这样的东西:

      item1.a item1.b item1.c item1.d item2.a item2.b item2.c item2.d
1       1       0       0       0       0       1       0       0
2       0       1       0       0       0       1       0       0
3       1       0       0       0       0       0       1       0
4       0       0       1       0       0       0       1       0
5       0       0       0       1       1       0       0       0

如果您可以使用 pivot_longer 或任何其他工具推荐任何解决方案,我将不胜感激。

你的数据一开始有点奇怪。最好让它变长,添加更多信息,然后再变宽。例如

math_exam %>% 
  pivot_longer(item1:item2) %>% 
  mutate(id=row_number(), ind=1) %>% 
  pivot_wider(names_from = c(name, value), values_from=ind, values_fill=0)

您可以使用 %>% select(-id)

删除您喜欢的 id

可能太复杂了,但你可以试试:

library(dplyr)
library(tidyr)

math_exam %>%
  mutate(row = row_number()) %>%
  pivot_longer(cols = -row) %>%
  mutate(val = 1) %>% 
  group_by(row) %>%
  complete(name, value, fill = list(val = 0)) %>%
  arrange(name, value) %>%
  pivot_wider(names_from = c(name, value), values_from = val, 
              names_sep = '.', values_fill = 0) %>%
  ungroup %>%
  arrange(row) %>%
  select(-row)

#  item1.a item1.b item1.c item1.d item2.a item2.b item2.c item2.d
#    <dbl>   <dbl>   <dbl>   <dbl>   <dbl>   <dbl>   <dbl>   <dbl>
#1       1       0       0       0       0       1       0       0
#2       0       1       0       0       0       1       0       0
#3       1       0       0       0       0       0       1       0
#4       0       0       1       0       0       0       1       0
#5       0       0       0       1       1       0       0       0