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

问题描述

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

studentID 区域 学期 numHours
1 西 1 秋天 1 4-6
1 西 1 秋天 2 7-9
1 西 1 秋天 3 7-9 小时

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

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

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

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

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

studentID numHours.Fall numHours.Spring numHours.Summer
1 4-6 小于1 1-3 小时
2 4-6 小时 1-3 1-3 小时
3 4-6 小时 小于1 1-3 小时

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

我想要的格式如下:

studentID numHours.Fall numHours.Spring numHours.Summer
1 4-6 小于1 1-3 小时
1 5-7 小时 1-4 1-2 小时
1 4-6 小时 5-6 1-4 小时

任何帮助将不胜感激。我对 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)