簡體   English   中英

如何使用tidyverse或base-R函數整理非常混亂的長格式數據集?

[英]How can I tidy a very messy long format data set using tidyverse or base-R functions?

我有一個混亂和混亂的長格式數據集(我最近開始使用R並且無法掌握它,所以我需要一些指導)。

我的參與者在實驗中經歷了不同的階段。 在階段a,他們評價圖像。 在階段b,他們看到了一些具有不同影響的圖像。 在階段c中,他們評估了他們在階段b中看到的圖像。 我可以通過單獨的列檢索參與者評定的所有響應,影響信息和圖像。 我的目的是根據圖像影響分析響應為(無影響,正面,負面),我想知道對應於每個響應的圖像編號。

問題是當階段結束時,插入的最后一個值被復制到下面的行(因此應該省略),對於某些列,我有NAs,因為程序復制時沒有任何值。

此數據集的簡化版本如下所示:

> 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

我嘗試創建一個像上面那樣的新變量,但由於NAs(或者因為我的代碼沒有意義)而無法工作。

理想情況下,我希望能夠根據階段對數據進行子集化,我希望我的響應在一列中,一列中的相位(我已經在數據中有),一列中的相應圖像和另一列中的相應圖像(對於階段a應該沒有影響)。

期望的輸出肯定會有所幫助......

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

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM