如何将数据框重新排列为宽格式?

How to rearrange dataframe to wide format?

我有一个包含 3 列的数据框:参与者 ID、问题 ID 和包含他们是否给出正确 (1) 响应或 (0) 的列。 它看起来像这样:

> head(df)
# A tibble: 6 x 3
     ID questionID correct
  <dbl>      <int>   <dbl>
1     1          1       1
2     2          2       0
3     3          3       1
4     4          4       0
5     5          5       0
6     6          6       1

并且可以使用以下方法重新创建:

set.seed(0)
df <- tibble(ID = seq(1, 100, 1),
             questionID = rep(seq(1, 10,), 10),
             correct = base::sample(c(0, 1), size = 100, replace = TRUE))

现在我希望每个问题都有自己的专栏,最终目标是为其拟合 2PL 模型。为此目的,数据应该看起来像每个参与者 1 行和 11 列(ID 和 10 个问题列)。
我如何实现这一目标?

使用 data.table 你可以使用 dcast

df <- data.frame(ID=c(1,2,3,4,5,6), questionID= c(1,22,13,4,35,8),correct=c(1,0,1,0,0,1))
 df
 ID questionID correct
1  1          1       1
2  2         22       0
3  3         13       1
4  4          4       0
5  5         35       0
6  6          8       1

setDT(df)
dcast(df,ID~questionID,value.var="correct")
   ID  1  4  8 13 22 35
1:  1  1 NA NA NA NA NA
2:  2 NA NA NA NA  0 NA
3:  3 NA NA NA  1 NA NA
4:  4 NA  0 NA NA NA NA
5:  5 NA NA NA NA NA  0
6:  6 NA NA  1 NA NA NA

# replace NA to what you want
df[is.na(df)]<- "-"

您可以使用 tidyr 包中的 pivot_wider

df %>%
  pivot_wider(names_from = questionID,
              values_from = correct,
              names_prefix = "questionID_")

# A tibble: 100 x 11
      ID questionID_1 questionID_2 questionID_3 questionID_4
   <dbl>        <dbl>        <dbl>        <dbl>        <dbl>
 1     1            1           NA           NA           NA
 2     2           NA            0           NA           NA
 3     3           NA           NA            0           NA
 4     4           NA           NA           NA            1
 5     5           NA           NA           NA           NA
 6     6           NA           NA           NA           NA
 7     7           NA           NA           NA           NA
 8     8           NA           NA           NA           NA
 9     9           NA           NA           NA           NA
10    10           NA           NA           NA           NA
# ... with 90 more rows, and 6 more variables: questionID_5 <dbl>,
#   questionID_6 <dbl>, questionID_7 <dbl>, questionID_8 <dbl>,
#   questionID_9 <dbl>, questionID_10 <dbl>