首页 > 解决方案 > tidyr:将一列分成可变数量的列

问题描述

我的数据框中有一个变量,其中包含回答问卷中不同问题的长度。数据结构如下:

data <- data.frame(variables = c("q1:2,q2:3,q3:4,q4:10,q5:1",
                                 "q2:3,q1:2,q3:2,q5:2,q4:9",
                                 "q1:1,q2:4,q5:8"))
        separate(variables, sep=",", into=??)

q1:2表示该受访者需要 2 秒才能回答问题 1 (q1)。

现在,我想在separate()此列中使用分隔符“,”。但我不知道“into”参数应该是什么,因为并非所有受访者都回答了相同数量的问题。

目标是拥有这样的数据框(与持续时间无关,仅与每个问卷中问题的位置有关):

pos_q1 pos_q2 pos_q3 pos_q4 pos_q5
----------------------------------
     1      2      3      4      5
     2      1      3      5      4
     1      2     NA     NA      3          

有人可以帮忙吗?谢谢!

标签: rtidyr

解决方案


您可以先使用 获取长格式数据separate_rows,然后将其separate放入不同的列,为每一行创建一个行号列并获取宽格式数据。

library(dplyr)
library(tidyr)

data %>%
  mutate(id = row_number()) %>%
  separate_rows(variables, sep = ',') %>%
  separate(variables, c('question', 'time'), sep = ':') %>%
  group_by(id) %>%
  mutate(time = row_number()) %>%
  ungroup %>%
  pivot_wider(names_from = question,values_from=time, names_prefix = 'pos_') %>%
  select(-id)

# A tibble: 3 x 5
#  pos_q1 pos_q2 pos_q3 pos_q4 pos_q5
#   <int>  <int>  <int>  <int>  <int>
#1      1      2      3      4      5
#2      2      1      3      5      4
#3      1      2     NA     NA      3

推荐阅读