使用R将数据从交叉表重新格式化为单数据行格式

我使用R来通过一个API拉入数据,并将其全部合并到一个表中,然后写入一个CSV文件。 但是,要在Tableau中正确绘制图表,我需要使用Excel的重新格式化工具将数据从交叉表格格式转换为每行仅包含一个数据段的格式。 例如,采取以下格式:

ID,Gender,School,Math,English,Science 1,M,West,90,80,70 2,F,South,50,50,50 

至:

 ID,Gender,School,Subject,Score 1,M,West,Math,90 1,M,West,English,80 1,M,West,Science,70 2,F,South,Math,50 2,F,South,English,50 2,F,South,Science,50 

在R或R库中是否有任何现有的工具可以让我这样做,或者提供一个起点? 我正在尝试自动为Tableau准备数据,以便我只需要运行一个脚本就可以正确格式化它,并且想要删除手动Excel步骤(如果可能的话)。

在R和其他几个程序中,这个过程被称为“重塑”数据。 实际上, 您最初链接的Tableau页面提到了他们的“Excel Reshaper插件”。

在R的基础上,有几个函数来重塑数据,比如将面板数据从宽表单转换为长表单的(臭名昭着的reshape()函数stack() ,以及创build数据的小型stack()

尽pipe如此,“reshape2”软件包似乎更受这种数据转换的欢迎。 下面是一个“融化”您的样本数据的例子,我已经存储在名为“mydf”的data.frame中:

 library(reshape2) melt(mydf, id.vars=c("ID", "Gender", "School"), value.name="Score", variable.name="Subject") # ID Gender School Subject Score # 1 1 M West Math 90 # 2 2 F South Math 50 # 3 1 M West English 80 # 4 2 F South English 50 # 5 1 M West Science 70 # 6 2 F South Science 50 

对于这个例子,base R的reshape()不是很合适,但是stack()是。 在这里,我只是把最后三列写成了:

 stack(mydf[4:6]) # values ind # 1 90 Math # 2 50 Math # 3 80 English # 4 50 English # 5 70 Science # 6 50 Science 

要获得你正在寻找的data.frame ,你需要用上面的输出来cbind前三列。


作为参考,Hadley Wickham的“ 整洁数据” ( Tidy Data)文章是考虑数据结构如何促进进一步处理和可视化的一个很好的切入点。