tidyr: разделить столбец на переменное количество столбцов

#r #tidyr

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

Кто-нибудь может помочь? Спасибо!

Комментарии:

1. Я не совсем понимаю последнюю строку в вашем выводе, почему это 1, 2, NA, NA, 3?

2. Поскольку сначала был дан ответ на вопрос 1, затем был дан ответ на вопрос 2 и, наконец, на вопрос 5 (q3 и q4 вообще не были даны ответы).

Ответ №1:

Сначала вы можете получить данные в длинном формате с 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