按id传播数据table

Spread data table by id

我有以下 data.table:

> df
   month student A B  C  D
1:     1     Amy 9 6  1 11
2:     1     Bob 8 5  5  2
3:     2     Amy 7 7  2  4
4:     2     Bob 6 6  6  6
5:     3     Amy 6 8 10  7
6:     3     Bob 9 7 11  3

我想将此 data.table 转换为这种格式:> df1

    month cols Amy Bob
 1:     1    A   9   8
 2:     1    B   6   5
 3:     1    C   1   5
 4:     1    D  11   2
 5:     2    A   7   6
 6:     2    B   7   6
 7:     2    C   2   6
 8:     2    D   4   6
 9:     3    A   6   9
10:     3    B   8   7
11:     3    C  10  11
12:     3    D   7   3

我使用 dcast 等尝试了多种方法,但无法转换数据。请帮助!

您必须 melt 数据框,然后 dcast -

tmp = melt(df, id = c("month", "student"), , variable.name = "cols")
df1 = dcast(tmp, month + cols ~ student, value.var = "value")

两者都来自 data.table 图书馆

一种tidyr方法。

> library(tidyr)
> df %>%
    gather(cols, values,  A:D) %>% 
    spread(student, values)
   month cols Amy Bob
1      1    A   9   8
2      1    B   6   5
3      1    C   1   5
4      1    D  11   2
5      2    A   7   6
6      2    B   7   6
7      2    C   2   6
8      2    D   4   6
9      3    A   6   9
10     3    B   8   7
11     3    C  10  11
12     3    D   7   3