[英]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.