У мене є дані інтернет-опитування, де респонденти переглядають цикл питань 1-3 рази. Огляд програмного забезпечення (Qualtrics) записує ці дані в кілька стовпчиків, тобто, В3.2 в огляді матиме стовпці Q3.2.1.
, Q3.2.2.
і Q3.2.3.
:
df <- data.frame(
id = 1:10,
time = as.Date('2009-01-01') + 0:9,
Q3.2.1. = rnorm(10, 0, 1),
Q3.2.2. = rnorm(10, 0, 1),
Q3.2.3. = rnorm(10, 0, 1),
Q3.3.1. = rnorm(10, 0, 1),
Q3.3.2. = rnorm(10, 0, 1),
Q3.3.3. = rnorm(10, 0, 1)
)
# Sample data
id time Q3.2.1. Q3.2.2. Q3.2.3. Q3.3.1. Q3.3.2. Q3.3.3.
1 1 2009-01-01 -0.2059165 -0.29177677 -0.7107192 1.52718069 -0.4484351 -1.21550600
2 2 2009-01-02 -0.1981136 -1.19813815 1.1750200 -0.40380049 -1.8376094 1.03588482
3 3 2009-01-03 0.3514795 -0.27425539 1.1171712 -1.02641801 -2.0646661 -0.35353058
...
Я хочу об'єднати всі стовпці QN.N * в охайні окремі стовпці QN.N, врешті-решт, закінчившись чимось таким:
id time loop_number Q3.2 Q3.3
1 1 2009-01-01 1 -0.20591649 1.52718069
2 2 2009-01-02 1 -0.19811357 -0.40380049
3 3 2009-01-03 1 0.35147949 -1.02641801
...
11 1 2009-01-01 2 -0.29177677 -0.4484351
12 2 2009-01-02 2 -1.19813815 -1.8376094
13 3 2009-01-03 2 -0.27425539 -2.0646661
...
21 1 2009-01-01 3 -0.71071921 -1.21550600
22 2 2009-01-02 3 1.17501999 1.03588482
23 3 2009-01-03 3 1.11717121 -0.35353058
...
tidyr
Бібліотека має gather()
функцію, яка працює відмінно підходить для комбінування одного набору стовпців:
library(dplyr)
library(tidyr)
library(stringr)
df %>% gather(loop_number, Q3.2, starts_with("Q3.2")) %>%
mutate(loop_number = str_sub(loop_number,-2,-2)) %>%
select(id, time, loop_number, Q3.2)
id time loop_number Q3.2
1 1 2009-01-01 1 -0.20591649
2 2 2009-01-02 1 -0.19811357
3 3 2009-01-03 1 0.35147949
...
29 9 2009-01-09 3 -0.58581232
30 10 2009-01-10 3 -2.33393981
Отриманий кадр даних має 30 рядків, як очікувалося (10 особин, 3 петлі в кожному). Однак збір другого набору стовпців працює не правильно - він успішно робить два комбіновані стовпці Q3.2
і Q3.3
, але закінчується на 90 рядків замість 30 (всі комбінації з 10 осіб, 3 петлі Q3.2 та 3 циклів Q3 .3; комбінації істотно збільшаться для кожної групи стовпців у фактичних даних):
df %>% gather(loop_number, Q3.2, starts_with("Q3.2")) %>%
gather(loop_number, Q3.3, starts_with("Q3.3")) %>%
mutate(loop_number = str_sub(loop_number,-2,-2))
id time loop_number Q3.2 Q3.3
1 1 2009-01-01 1 -0.20591649 1.52718069
2 2 2009-01-02 1 -0.19811357 -0.40380049
3 3 2009-01-03 1 0.35147949 -1.02641801
...
89 9 2009-01-09 3 -0.58581232 -0.13187024
90 10 2009-01-10 3 -2.33393981 -0.48502131
Чи є спосіб використовувати кілька викликів, gather()
як це, комбінуючи невеликі підмножини стовпців, як це, зберігаючи правильну кількість рядків?
seperate()
щоб розділити значення Q3.3 (і далі) на власні стовпці. Але це все ще здається справді крутим хакі-рішенням ...
spread
я працюю над рішенням: p
df %>% gather(question_number, Q3.2, starts_with("Q3.")) %>% mutate(loop_number = str_sub(question_number,-2,-2), question_number = str_sub(question_number,1,4)) %>% select(id, time, loop_number, question_number, Q3.2) %>% spread(key = question_number, value = Q3.2)
spread()
. Хоча численні дзвінки все-таки видаються неминучими, будь то група роботи generate()
, яка працює, або вкладені spread()
s…
df %>% gather(loop_number, Q3.2, starts_with("Q3."))