【问题标题】:Further specification on how to properly use the reshape() function关于如何正确使用 reshape() 函数的进一步说明
【发布时间】:2021-05-08 04:19:27
【问题描述】:

我正在研究一个项目,以了解学生在大学期间每年每个学期的平均学习量是否存在趋势。每个数据框在读入时被列为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 函数将数据从“长”格式更改为“宽”格式,这样我就可以拥有三个新列,每个学期一个(秋季、春季, 夏季) 以及每个学生在哪个学期每周学习的小时数。我是这样写的:

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

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

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

我想要的格式是这样的:

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 的新手,所以尽量解释得好像我一无所知。

【问题讨论】:

    标签: r dataframe reshape2


    【解决方案1】:

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

    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)
    

    【讨论】:

    • 不怕。运行该代码,然后重新运行我的 reshape 函数并得到相同的结果。
    • 对不起。我刚刚意识到我需要将您编写的函数分配给名称year1Reduced.wide.Reshape 以保存它。是的,它奏效了。谢谢。
    猜你喜欢
    • 1970-01-01
    • 2021-03-10
    • 2014-04-14
    • 1970-01-01
    • 2016-04-15
    • 1970-01-01
    • 2015-09-26
    • 2011-07-14
    • 2019-05-14
    相关资源
    最近更新 更多