重塑/重组数据的最佳方法是什么?

机器算法验证 r 擅长 数据预处理
2022-03-28 05:36:49

我是实验室的研究助理(志愿者)。我和一个小组的任务是对从一项大型研究中提取的一组数据进行数据分析。不幸的是,这些数据是通过某种在线应用程序收集的,并且没有被编程为以最可用的形式输出数据。

下面的图片说明了基本问题。有人告诉我,这被称为“重塑”或“重组”。

问题:对于具有超过 10k 个条目的大型数据集,从图 1 到图 2 的最佳过程是什么?

这是一个示例,实际文件有超过 10k 个条目。 我已经进行了颜色编码以帮助清晰

这就是所有需要转换的内容。

3个回答

正如我在评论中指出的那样,问题中没有足够的细节来制定真正的答案。由于您甚至需要帮助甚至找到正确的术语并提出您的问题,所以我可以简要概括一下。

您正在寻找的术语是数据清理这是获取原始、格式不正确(脏)的数据并将其成形以进行分析的过程。更改和规范格式(“二”)以及重新组织行和列是典型的数据清理任务。 2

从某种意义上说,数据清理可以在任何软件中完成,可以使用 Excel 或 R 完成。这两种选择各有利弊:

  • Excel: Excel 几乎可以肯定是数据清理的最常见选择(请参阅 R fortunes #59 pdf)。统计学家也认为这是一个糟糕的选择。主要原因是很难确保您已经捕获了所有内容,或者您​​对所有内容都一视同仁,并且没有记录您所做的更改,因此您以后无法重新访问这些更改。使用 Excel 的好处是可以更轻松地查看您在做什么,而且您无需了解太多即可进行更改。(统计学家会认为后者是一个额外的骗局。)
  • R: R 需要陡峭的学习曲线。如果您对 R 或编程不是很熟悉,那么在 Excel 中可以非常快速轻松地完成的事情将会使您在 R 中尝试感到沮丧。另一方面,如果您必须再次这样做,那么学习将是时间花得很好。此外,编写和保存代码以清理 R 中的数据的能力将减轻上面列出的缺点。以下是一些链接,可帮助您开始在 R 中完成这些任务:

    您可以在Stack Overflow上获得很多有用的信息

    Quick-R也是一种宝贵的资源:

    让数字进入数字模式:

    另一个了解 R 的宝贵资源是UCLA 的统计帮助网站

    最后,你总能在老旧的谷歌上找到很多信息:


更新:当您对每个“研究单位”(在您的情况下是一个人)进行多次测量时,这是关于数据集结构的常见问题。如果每个人都有一行,则称您的数据为“宽”形式,但是例如,您的响应变量必须有多个列。另一方面,您的响应变量可以只有一列(但结果是每人多行),在这种情况下,您的数据被称为“长”形式。在这两种格式之间移动通常被称为“重塑”数据,尤其是在 R 世界中。

  • 标准的 R 函数是?reshapeUCLA 的统计帮助网站上 使用指南。reshape()
  • 很多人认为reshape很难合作。 Hadley Wickham提供了一个名为reshape2的包,旨在简化该过程。Hadley 的 reshape2 个人网站在这里,Quick-R 概述在这里,这里有一个好看的教程
  • SO上有很多关于如何重塑数据的问题。他们中的大多数都是关于从广泛到长期的,因为这通常是数据分析师面临的问题。您的问题是关于从长到宽的问题,这种情况不太常见,但是仍然有很多线程,您可以通过此搜索查看它们。
  • 如果您决定尝试使用 Excel 执行此操作,这里有一个关于为 Excel 编写 VBA 宏以复制重塑功能的线程:使用 VBA 在 Excel 中融化/重新塑造?

尝试使用 R 进行以下操作:

> ddf
   sess_id user_id     quest  response
1        1       a       age        29
2        1       a satisfied  st_agree
3        1       a    gender      male
4        1       a     phone    iphone
5        2       a       age        29
6        2       a satisfied not_agree
7        2       a    gender    female
8        2       a     phone    iphone
9        3       b       age        29
10       3       b satisfied     agree
11       3       b    gender      male
12       3       b     phone   android
> 
> library(reshape2)
> dcast(ddf, sess_id+user_id ~ quest, value.var='response')
  sess_id user_id age gender   phone satisfied
1       1       a  29   male  iphone  st_agree
2       2       a  29 female  iphone not_agree
3       3       b  29   male android     agree

在 Scala 中,这称为“爆炸”操作,可以在数据帧上完成。如果你的数据是一个rdd,你首先通过命令转换为dataFrame toDF,然后使用.explode方法。