回答者が一連の質問を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()組み合わせるための素晴らしい作品の関数、1列のセットを:
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ループ)。ただし、列の2番目のセットを収集しても正しく機能しません。2つの列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.48502131gather()このように複数の呼び出しを使用して、正しい数の行を維持しながら、このような列の小さなサブセットを組み合わせる方法はありますか?
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()sの束であろうと、ネストされたspread()s であろうと…
                
df %>% gather(loop_number, Q3.2, starts_with("Q3."))