我有一个混乱且令人困惑的长格式数据集(我最近才开始使用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应该没有影响)。
答案 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