Как мне привести в порядок очень грязный набор данных длинного формата, используя функции tidyverse или base-R? - PullRequest
0 голосов
/ 07 мая 2019

У меня запутанный и запутанный набор данных в длинном формате (я начал использовать R совсем недавно и еще не смог освоить его, поэтому мне нужно некоторое руководство).

Мои участники прошли через разные фазы эксперимента.На этапе А они оценили изображения.На этапе b они увидели несколько изображений с различными эффектами.На этапе c они оценили изображения, которые видели на этапе b.Я могу извлечь все ответы, повлиять на информацию и изображения, которые участники оценили в отдельных столбцах.Моя цель состоит в том, чтобы проанализировать ответы в соответствии с изображением, на которое влияет аффект (без изменений, положительный, отрицательный), и я хочу знать номера изображений, соответствующие каждому ответу.

Проблема заключается в том, что фаза превышает последнее значениевставленный копируется в следующие строки (поэтому их следует опускать), и для некоторых столбцов у меня есть NA, так как выше нет значения, которое копирует программа.

Упрощенная версия этого набора данных выглядит следующим образом:

</p>

<code>      > df
    id phase phase.a.response phase.c.response phase.a.pic
1   1     a                1               NA       x.jpg
2   1     a                2               NA       y.jpg
3   1     a                3               NA       z.jpg
4   1     a               10               NA       d.jpg
5   1     b               10               NA       d.jpg
6   1     b               10               NA       d.jpg
7   1     b               10               NA       d.jpg
8   1     b               10               NA       d.jpg
9   1     c               10                5       d.jpg
10  1     c               10                4       d.jpg
11  1     c               10                2       d.jpg
12  1     c               10                1       d.jpg
      phase.b.pic pic.affect phase.c.pic
1         <NA>       <NA>        <NA>
2         <NA>       <NA>        <NA>
3         <NA>       <NA>        <NA>
4         <NA>       <NA>        <NA>
5        m.jpg   positive        <NA>
6        n.jpg   negative        <NA>
7        p.jpg   positive        <NA>
8        r.jpg   negative        <NA>
9        r.jpg   negative       n.jpg
10       r.jpg   negative       p.jpg
11       r.jpg   negative       r.jpg
12       r.jpg   negative       m.jpg

 data$response[data$phase=="a"]<-data$phase.a.response
 data$response[data$phase=="b"]<-data$phase.b.response
</code>

Я пытался создать новую переменную, подобную приведенной выше, но не работал из-за NA (или потому, что мой код не имеет смысла).

В идеале я хочу бытьвозможность подгруппировать мои данные в соответствии с фазами, и я хочу, чтобы мои ответы в одном столбце, фаза в одном столбце (который у меня уже есть в данных), соответствующие изображения в одном столбце и соответствующее изображение влияют в другом столбце (для фазы a следуетне имеет никакого влияния).

1 Ответ

0 голосов
/ 07 мая 2019

Желаемый вывод наверняка поможет ...

Вот первый шаг, использующий data.table

пример данных

library(data.table)
DT <- fread( "id  phase  phase.a.response  phase.c.response  phase.a.pic      phase.b.pic  pic.affect  phase.c.pic
1     a                1               NA       x.jpg1         <NA>       <NA>        <NA>
1     a                2               NA       y.jpg2         <NA>       <NA>        <NA>
1     a                3               NA       z.jpg3         <NA>       <NA>        <NA>
1     a               10               NA       d.jpg4         <NA>       <NA>        <NA>
1     b               10               NA       d.jpg5        m.jpg   positive        <NA>
1     b               10               NA       d.jpg6        n.jpg   negative        <NA>
1     b               10               NA       d.jpg7        p.jpg   positive        <NA>
1     b               10               NA       d.jpg8        r.jpg   negative        <NA>
1     c               10                5       d.jpg9        r.jpg   negative       n.jpg
1     c               10                4       d.jpg10       r.jpg   negative       p.jpg
1     c               10                2       d.jpg11       r.jpg   negative       r.jpg
1     c               10                1       d.jpg12       r.jpg   negative       m.jpg
")

код

#add row_id's
DT[, row := seq_along(id) ]

#melt for response
ans.response <- melt(DT, id.vars = c("row", "id","phase"), 
     measure.vars = patterns(response = "\\.response$"),
     variable.factor = FALSE,
     variable.name = "phase2",
     value.name = "response")[, phase2 := gsub("^phase\\.(.)\\.response", "\\1", phase2)][phase == phase2,][, phase2 := NULL]

#melt for pic
ans.pic <- melt(DT, id.vars = c("row", "id","phase"), 
                     measure.vars = patterns(pic = "\\pic$"),
                     variable.factor = FALSE,
                     variable.name = "phase2",
                     value.name = "pic")[, phase2 := gsub("^phase\\.(.)\\.pic", "\\1", phase2)][phase == phase2,][, phase2 := NULL]
#join
ans.response[ans.pic, on = .(row,id,phase)]

выход

#     row id phase response    pic
#  1:   1  1     a        1 x.jpg1
#  2:   2  1     a        2 y.jpg2
#  3:   3  1     a        3 z.jpg3
#  4:   4  1     a       10 d.jpg4
#  5:   5  1     b       NA  m.jpg
#  6:   6  1     b       NA  n.jpg
#  7:   7  1     b       NA  p.jpg
#  8:   8  1     b       NA  r.jpg
#  9:   9  1     c        5  n.jpg
# 10:  10  1     c        4  p.jpg
# 11:  11  1     c        2  r.jpg
# 12:  12  1     c        1  m.jpg
...