我有下面的数据集,来自一个选择实验:
ID task opt q1 q2 q3 q4 q5 q6 q7 q8
1 1 1 1 2 3 1 2 2 1 2 1
2 1 1 2 2 3 1 2 2 1 2 1
3 1 1 3 2 3 1 2 2 1 2 1
4 1 2 1 2 3 1 2 2 1 2 1
5 1 2 2 2 3 1 2 2 1 2 1
6 1 2 3 2 3 1 2 2 1 2 1
7 1 3 1 2 3 1 2 2 1 2 1
8 1 3 2 2 3 1 2 2 1 2 1
9 1 3 3 2 3 1 2 2 1 2 1
10 1 4 1 2 3 1 2 2 1 2 1
11 1 4 2 2 3 1 2 2 1 2 1
12 1 4 3 2 3 1 2 2 1 2 1
13 1 5 1 2 3 1 2 2 1 2 1
14 1 5 2 2 3 1 2 2 1 2 1
15 1 5 3 2 3 1 2 2 1 2 1
16 1 6 1 2 3 1 2 2 1 2 1
17 1 6 2 2 3 1 2 2 1 2 1
18 1 6 3 2 3 1 2 2 1 2 1
19 1 7 1 2 3 1 2 2 1 2 1
20 1 7 2 2 3 1 2 2 1 2 1
21 1 7 3 2 3 1 2 2 1 2 1
22 1 8 1 2 3 1 2 2 1 2 1
23 1 8 2 2 3 1 2 2 1 2 1
24 1 8 3 2 3 1 2 2 1 2 1
也就是说,个体1(ID
)被问了8个问题(task
),每个问题有3个选项(opt
)可供选择,剩下的列(q1...q8
)反映了她在每个选择任务中选择的选项,因此,她在问题1上选择了选项2,在问题7上又选择了选项2。
我想把它变成一个数据集,看起来像这样:
ID task opt chosen
1 1 1 1 FALSE
2 1 1 2 TRUE
3 1 1 3 FALSE
4 1 2 1 FALSE
5 1 2 2 FALSE
6 1 2 3 TRUE
7 1 3 1 TRUE
8 1 3 2 FALSE
9 1 3 3 FALSE
...
22 1 8 1 TRUE
23 1 8 2 FALSE
24 1 8 3 FALSE
换句话说,如果在该特定问题中选择了该特定选项,则新列(chosen
)反映TRUE
,否则反映FALSE
。
我尝试了所有形式的melt
、reshape
和cast
,但一无所获。
谢谢大家!
2条答案
按热度按时间oxf4rvwz1#
您可以先从
pivot_longer
列q1
到q8
,然后从filter
查找与task
列匹配的“q”编号。如果value
列与opt
列匹配,则将chosen
列设置为TRUE
。最后删除新创建的列。更新:感谢@Sotos改进了答案。现在我们直接从
value
与opt
的比较中设置逻辑列chosen
,而不使用if_else
。fnvucqvd2#
下面是一个
dplyr
解决方案,其中包含rowwise()
和c_across()
,您甚至不需要将数据转换为长格式。