首页 > 解决方案 > 关于如何正确使用 reshape() 函数的进一步说明

问题描述

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

学生卡 地区 学期 星期 数小时
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")
)

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

学生卡 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条目,而不是每个学生每学期只有一个条目。如果这只是我写的重塑代码的一个小改动,请告诉我。

我想要的格式如下所示:

学生卡 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 很陌生,所以尽量解释它,就好像我一无所知。

标签: rdataframereshape2

解决方案


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

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)

推荐阅读