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

时间:2013-08-26 14:35:30

标签: r excel data-structures dataformat tableau

我正在使用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步骤。

1 个答案:

答案 0 :(得分:1)

在R和其他几个程序中,此过程称为“重塑”数据。事实上,Tableau页面that you originally linked to谈到了他们的“Excel Reshaper插件”。

在基础R中,有一些函数可以重塑数据,例如(臭名昭着的)reshape()函数,它将面板数据从宽格式转换为长格式,而stack()则创建细长形式堆叠数据。

“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

对于此示例,基数R的reshape()不合适,但stack()是。在这里,我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论文是思考数据结构如何促进进一步处理和可视化的良好切入点。