关于如何正确使用 reshape() 函数的进一步说明

Further specification on how to properly use the reshape() function

我正在进行一个项目,该项目研究学生在大学期间每年每个学期的平均学习量是否存在趋势。每个数据框在读入时都列为 year1year2 等。我开始使用的数据框具有以下格式:

studentID region year semester week numHours
1 West 1 Fall 1 4-6
1 West 1 Fall 2 7-9
1 West 1 Fall 3 7-9 hour(s)

当然,这只列出了部分条目。

区域、年份和周列已删除。年份是因为每年都有一个单独的 csv 文件,而星期列是因为特定的星期并不重要,重要的是小时数。新数据框的名称为 year1Reducedyear2Reduced

删除列后我所做的下一件事是使用 reshape 函数将数据从“长”格式更改为“宽”格式,这样我就可以拥有三个新列,每个学期一个(秋季,Spring,夏季)以及每个学生在哪个学期每周学习的小时数。我是这样写的:

year1Reduced.wide.Reshape <- reshape(data = year1Reduced,
                             idvar = c("studentID"),
                             timevar = "semester",
                             direction = "wide",
                             v.names = c("numHours")
)

有点儿奏效了。我有一个不必要的列,我删除了它,但我也有秋季、Spring 和夏季的单独列,但没有列出每个学生每周学习的所有小时数,它只花了每个学生每个学期 numHours 下的第一个元素。这是它的样子:

studentID numHours.Fall numHours.Spring numHours.Summer
1 4-6 Less than 1 1-3 hour(s)
2 4-6 hour(s) 1-3 1-3 hour(s)
3 4-6 hour(s) less than 1 1-3 hour(s)

我想弄清楚的是如何包含所有 numHours 条目,而不是每个学生每学期只包含一个条目。如果这只是我写的重塑代码的一个小改动,请告诉我。

我想要的格式如下所示:

studentID numHours.Fall numHours.Spring numHours.Summer
1 4-6 Less than 1 1-3 hour(s)
1 5-7 hour(s) 1-4 1-2 hour(s)
1 4-6 hour(s) 5-6 1-4 hour(s)

如有任何帮助,我们将不胜感激。我是 R 的新手,所以如果可能的话,试着解释一下,就好像我什么都不知道一样。

我们没有足够的数据来对此进行测试,但您可以尝试:

library(dplyr)
library(tidyr)

year1Reduced %>%
  select(studentID, semester, numHours) %>%
  group_by(studentID, semester) %>%
  mutate(row = row_number()) %>%
  ungroup %>%
  pivot_wider(names_from = semester, values_from = numHours) %>%
  select(-row)