选择R中离散选择实验中选择的选项

byqmnocz  于 2023-01-06  发布在  其他
关注(0)|答案(2)|浏览(128)

我有下面的数据集,来自一个选择实验:

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
我尝试了所有形式的meltreshapecast,但一无所获。
谢谢大家!

oxf4rvwz

oxf4rvwz1#

您可以先从pivot_longerq1q8,然后从filter查找与task列匹配的“q”编号。如果value列与opt列匹配,则将chosen列设置为TRUE。最后删除新创建的列。
更新:感谢@Sotos改进了答案。现在我们直接从valueopt的比较中设置逻辑列chosen,而不使用if_else

library(dplyr)
library(tidyr)

df %>% pivot_longer(q1:q8, names_to = "Q") %>% 
  filter(task == gsub("q", "", Q)) %>% 
  mutate(chosen = value == opt) %>%
  select(-Q, -value)

   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
10  1    4   1  FALSE
11  1    4   2   TRUE
12  1    4   3  FALSE
13  1    5   1  FALSE
14  1    5   2   TRUE
15  1    5   3  FALSE
16  1    6   1   TRUE
17  1    6   2  FALSE
18  1    6   3  FALSE
19  1    7   1  FALSE
20  1    7   2   TRUE
21  1    7   3  FALSE
22  1    8   1   TRUE
23  1    8   2  FALSE
24  1    8   3  FALSE
fnvucqvd

fnvucqvd2#

下面是一个dplyr解决方案,其中包含rowwise()c_across(),您甚至不需要将数据转换为长格式。

library(dplyr)

df %>%
  rowwise() %>%
  mutate(chosen = c_across(q1:q8)[task] == opt) %>%
  ungroup() %>%
  select(!q1:q8)

# A tibble: 24 × 4
      ID  task   opt chosen
   <int> <int> <int> <lgl> 
 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 
10     1     4     1 FALSE 
11     1     4     2 TRUE  
12     1     4     3 FALSE 
13     1     5     1 FALSE 
14     1     5     2 TRUE  
15     1     5     3 FALSE 
16     1     6     1 TRUE  
17     1     6     2 FALSE 
18     1     6     3 FALSE 
19     1     7     1 FALSE 
20     1     7     2 TRUE  
21     1     7     3 FALSE 
22     1     8     1 TRUE  
23     1     8     2 FALSE 
24     1     8     3 FALSE

相关问题