응답자가 질문을 1-3 번 반복하는 온라인 설문 조사의 데이터가 있습니다. 설문 조사 소프트웨어 (Qualtrics)는이 데이터를 여러 열에 기록합니다. 즉, 설문 조사의 Q3.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
만 30 개가 아닌 90 개의 행으로 끝납니다 (모든 개인 조합 10 개, Q3.2의 3 개 루프, Q3의 3 개 루프). .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()
…
df %>% gather(loop_number, Q3.2, starts_with("Q3."))