#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