如何将数据框重新排列为宽格式?
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>
我有一个包含 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>