Изменение продольного значения на широкое для данных с несколькими строками на субъект - PullRequest
0 голосов
/ 19 января 2019

R: изменение формы данных с длинных на широкие, включая дату

(я пытался включить данные, но форматирование было настолько ужасным, что я сдался).

У меня естьвопрос по изменению продольных данных.Хитрость заключается в том, что у меня есть несколько строк на тему (row_num варьируется от 1 до 8).

Я просмотрел более 20 страниц переполнения стека, некоторые другие страницы и посты (и статьи) Хэдли по изменению формы, и, кажется, есть пробел, который я не могу найти:

У меня есть несколько строк на предмет, и я не могу узнать, как превратить это в один ряд.Хитрость в том, что мне нужно взять (скажем) Q1, ..., Q5 и превратить его в два или более блоков вопросов (Q1.1, ..., Q5.1, Q1.2, ... Q5.2, ...)

Используя одну терминологию, 'row_num' является переменной внутри субъекта , и, кажется, все основано на между-субъект переменные.

Это озадачивает и расстраивает меня, так как ИМХО классическая продольная и широкая ситуация = несколько строк на субъект (с одним блоком переменных) до одной строки на субъект (с несколькими блоками переменных).

Может ли кто-нибудь направить меня к некоторым ответам или учебным пособиям, которые будут охватывать это?

Большое спасибо!

После редактирования вот как будет выглядеть dput исходного фрейма данных:

# A tibble: 6 x 9
  Subject_ID row_num Date          Q1 Q2_text       Q3    Q4    Q5 Q6_text      
       <dbl>   <dbl> <date>     <dbl> <chr>      <dbl> <dbl> <dbl> <chr>        
1          1       1 2019-01-01     4 Because        5     5     1 and so on    
2          1       2 2019-01-02     1 O, bother      5     4     1 NA           
3          1       3 2019-01-03     2 NA             3     4    NA NA           
4          2       1 2018-12-04    NA NA             1     4     1 NA           
5          3       1 2018-12-15     3 In addtion     5    NA     3 NA           
6          3       2 2018-12-26     1 NA             4     3     2 in conclusion

Ответы [ 2 ]

0 голосов
/ 20 января 2019

Вот подход, использующий tidyr.

library(tidyr)
df2 <- df %>%
  # (optional) First convert all the data columns to text so 
  #   they're readable throughout the process.
  mutate_at(vars(Date:Q6_text), as.character) %>%

  # Gather into long format, where we record the column it came from 
  #   as "question" and the value it held as "value"
  gather(question, value, -Subject_ID, -row_num) %>%

  # Combine the row_num and question into a new column
  unite("question2", c("row_num", "question")) %>%

  # Use that new column to spread everything out
  spread(question2, value)


> df2
  Subject_ID     1_Date 1_Q1  1_Q2_text 1_Q3 1_Q4 1_Q5 1_Q6_text     2_Date 2_Q1 2_Q2_text 2_Q3 2_Q4 2_Q5     2_Q6_text     3_Date 3_Q1 3_Q2_text 3_Q3 3_Q4 3_Q5 3_Q6_text
1          1 2019-01-01    4    Because    5    5    1 and so on 2019-01-02    1 O, bother    5    4    1          <NA> 2019-01-03    2      <NA>    3    4 <NA>      <NA>
2          2 2018-12-04 <NA>       <NA>    1    4    1      <NA>       <NA> <NA>      <NA> <NA> <NA> <NA>          <NA>       <NA> <NA>      <NA> <NA> <NA> <NA>      <NA>
3          3 2018-12-15    3 In addtion    5 <NA>    3      <NA> 2018-12-26    1      <NA>    4    3    2 in conclusion       <NA> <NA>      <NA> <NA> <NA> <NA>      <NA>
0 голосов
/ 19 января 2019

Мы могли бы помочь, если вы предоставили пример данных. Сеть полна учебников по использованию следующих функций, которые делают то, что вас интересует:

gather() и spread() из пакета tidyr

melt() и dcast() из пакета reshape2

...