R语言 重构具有大量无序响应的长数据集

oxalkeyp  于 2023-02-14  发布在  其他
关注(0)|答案(1)|浏览(146)

我有一个包含参与者对许多问卷的回答的大型数据集。我试图将其转换为wide,但问题是并非所有参与者都回答了所有问卷,因此当转换为wide时,他们的回答并不对齐。每个问卷也没有实际变量,只有一个总体问卷变量,它表示参与者回答了哪个问卷和项目。以及单独的响应变量。
长数据集如下所示:

#long dataset 
subject<-c(1,1,1,1,1,1,2,2,2,2,2,2)
questionnaire<-c("Q1_1", "Q1_2", "Q1_3", "Q2_1", "Q2_2", "Q2_3", 
                 "Q2_1", "Q2_2", "Q2_3", "Q3_1", "Q3_2", "Q3_3")
response<-c(1,2,1,4,3,1,2,1,5,3,1,2)
uniqid<-c(1,2,3,4,5,6,7,8,9,10,11,12)

long<-as.data.frame(cbind(subject, questionnaire, response, uniqid))

long
   subject questionnaire response uniqid
1        1          Q1_1        1      1
2        1          Q1_2        2      2
3        1          Q1_3        1      3
4        1          Q2_1        4      4
5        1          Q2_2        3      5
6        1          Q2_3        1      6
7        2          Q2_1        2      7
8        2          Q2_2        1      8
9        2          Q2_3        5      9
10       2          Q3_1        3     10
11       2          Q3_2        1     11
12       2          Q3_3        2     12

Q1表示第一个调查表,Q2表示第二个调查表,依此类推,_1、_2等是每个调查表中的项目。我希望数据最终看起来是:

subject    Q1_1    Q1_2    Q1_3    Q2_1    Q2_2    Q2_3  
1          1       1       2       1       4       3       1
2          2       NA      NA      NA      2       1       5

每个调查表和项目都是如此。
目前的数据看起来更像这样:

subject    questionnaire.1    response.1    questionnaire.2    response.2 
1         1               Q1_1             1               Q1_2             2
2         2               Q2_1             2               Q2_2             1

等等。
我现在遇到两个问题。
1.并非所有参与者都回答了所有问卷。他们开始问卷的时间与其他人不同。这导致在转换为宽时,同一列中对不同问卷的回答。即如上所述,参与者1正在回答问卷1中的问卷1第1项。而参与者2正在回答问卷2的第1项。我不知道如何使每一列对所有参与者都代表相同的问卷项目。
1.我不希望有一个单独的问卷和回复栏,而希望只有一个问卷栏(即标题为Q1_1等),下面是所有参与者的回复。这很容易实现,但由于每一栏都有许多不同问卷的回复,如果不首先重新排序,我无法实现这一点。
我想到的唯一解决方案是为长数据集中每个参与者没有回答的问卷插入NA行。例如,在上面的示例中,为参与者2没有回答Q1项目的地方插入3个NA行。然而,数据集非常大,我相信有更简单的方法来实现我正在尝试做的事情。

8cdiaqws

8cdiaqws1#

library(dplyr)
library(tidyr)

long |> 
  select(-uniqid) |> 
  pivot_wider(names_from = questionnaire, values_from = response)

# A tibble: 2 × 10
  subject Q1_1  Q1_2  Q1_3  Q2_1  Q2_2  Q2_3  Q3_1  Q3_2  Q3_3 
  <chr>   <chr> <chr> <chr> <chr> <chr> <chr> <chr> <chr> <chr>
1 1       1     2     1     4     3     1     NA    NA    NA   
2 2       NA    NA    NA    2     1     5     3     1     2

相关问题