如何使用tidyverse或base-R函数整理非常混乱的长格式数据集?

时间:2019-05-07 15:16:11

标签: r reshape2

我有一个混乱且令人困惑的长格式数据集(我最近才开始使用R,现在还无法掌握它,因此我需要一些指导)。

我的参与者在实验中经历了不同的阶段。在阶段A中,他们对图像进行了评分。在阶段b中,他们看到了一些具有不同影响的图像。在阶段c中,他们对在阶段b中看到的图像进行了评级。我可以检索所有响应,影响信息以及参与者通过单独的列进行评分的图像。我的目的是根据图像的影响程度(无影响,正面,负面)分析响应,我想知道与每个响应相对应的图像编号。

问题是,当阶段结束时,将插入的最后一个值复制到以下行(因此应省略),并且对于某些列,我具有NA,因为程序复制后没有其他值。

此数据集的简化版本如下:

> 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

我试图创建一个与上面的变量类似的新变量,但是由于NA(或者我的代码没有意义)而无法正常工作。

理想情况下,我希望能够根据阶段对数据进行子集化,并且希望将我的响应放在一栏中,一栏中的阶段(我已经在数据中了),一栏中的对应图像和相应的影像影响在另一列中(对于阶段a应该没有影响)。

1 个答案:

答案 0 :(得分:0)

期望的输出肯定会有所帮助...

这是第一次使用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