问题描述
我正在开展一个项目,研究学生在大学期间每年每个学期的平均学习量是否存在趋势。每个数据框在读入时都被列为 year1
、year2
等。我开始使用的数据框具有以下格式:
studentID | 区域 | 年 | 学期 | 周 | numHours |
---|---|---|---|---|---|
1 | 西 | 1 | 秋天 | 1 | 4-6 |
1 | 西 | 1 | 秋天 | 2 | 7-9 |
1 | 西 | 1 | 秋天 | 3 | 7-9 小时 |
当然,这里只列出了部分条目。
删除了地区、年份和周列。年份是因为每一年都有一个单独的 csv 文件,而周列是因为特定的一周并不重要,只是小时数。新数据框的名称为 year1Reduced
、year2Reduced
等。
删除列后的下一件事是使用 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)