我正在使用与此类似的数据框:

df<-data.frame(student=c(rep(1,5),rep(2,5)), month=c(1:5,1:5),
      quiz1p1=seq(20,20.9,0.1),quiz1p2=seq(30,30.9,0.1),
      quiz2p1=seq(80,80.9,0.1),quiz2p2=seq(90,90.9,0.1))

print(df)

   student month quiz1p1 quiz1p2 quiz2p1 quiz2p2
1     1     1    20.0    30.0    80.0    90.0
2     1     2    20.1    30.1    80.1    90.1
3     1     3    20.2    30.2    80.2    90.2
4     1     4    20.3    30.3    80.3    90.3
5     1     5    20.4    30.4    80.4    90.4
6     2     1    20.5    30.5    80.5    90.5
7     2     2    20.6    30.6    80.6    90.6
8     2     3    20.7    30.7    80.7    90.7
9     2     4    20.8    30.8    80.8    90.8
10    2     5    20.9    30.9    80.9    90.9

描述学生在五个月内获得的成绩-分两个测验,每个测验分为两部分。

我需要将两个测验分成不同的行-以便每个月的每个学生都有两行,每个测验一个,两列-每个测验部分。
当我融化桌子时:
melt.data.frame(df, c("student", "month"))

我也将测验的两个部分放在单独的行中。
dcast(dfL,student+month~variable)

当然可以让我回到刚开始的地方,而且找不到将表转换回所需表格的方法。
有没有一种方法可以使melt命令功能类似:
melt.data.frame(df, measure.var1=c("quiz1p1","quiz2p1"),
                measure.var2=c("quiz1p2","quiz2p2"))

最佳答案

这是使用R开头的reshape()的方法:

df2 <- reshape(df, direction="long",
               idvar = 1:2, varying = list(c(3,5), c(4,6)),
               v.names = c("p1", "p2"), times = c("quiz1", "quiz2"))

## Checking the output
rbind(head(df2, 3), tail(df2, 3))
#           student month  time   p1   p2
# 1.1.quiz1       1     1 quiz1 20.0 30.0
# 1.2.quiz1       1     2 quiz1 20.1 30.1
# 1.3.quiz1       1     3 quiz1 20.2 30.2
# 2.3.quiz2       2     3 quiz2 80.7 90.7
# 2.4.quiz2       2     4 quiz2 80.8 90.8
# 2.5.quiz2       2     5 quiz2 80.9 90.9

您还可以为idvarvarying使用列名(而不是列号)。它比较冗长,但对我来说似乎是更好的做法:
## The same operation as above, using just column *names*
df2 <- reshape(df, direction="long", idvar=c("student", "month"),
               varying = list(c("quiz1p1", "quiz2p1"),
                              c("quiz1p2", "quiz2p2")),
               v.names = c("p1", "p2"), times = c("quiz1", "quiz2"))

10-04 11:28