【问题标题】:Looking for a way to make my data horizontal in R寻找一种使我的数据在 R 中水平的方法
【发布时间】:2020-03-27 11:38:30
【问题描述】:

我目前在一个心理学实验室工作,并开始对一项任务的响应时间数据进行数据分析。

任务本身进行了多次试验,这使得数据看起来杂乱无章 - 尤其是现在,因为我最初的工作是将所有数据合并到一个数据框中。在数据的垂直方向上,我们可以看到参与 ID 和响应时间。太好了,这些都是重要的信息。但是,我们没有看到试验数字等,而是看到了如下所示的数据:

Participant 1, 23
Participant 1, 22
Participant 1, 25
Participant 2, 36

就像重复的参与者 ID 一样(我们的样本量可以达到数千,因此我们的数据框很长)。我们无法挑选出重要信息,也无法查看哪个试验是哪个。所以,我们想要一个水平的表示。

现在,我使用 R 作为数据分析的手段......但我对 R 有点陌生,这是我第一个使用它的项目。虽然我已经完成了在线 R 课程,但在使用实际数据时,你确实学得最好。

在努力修复我的数据时,我一直在研究 reshape 和 tidyr 包:reshape 有 melt 和 cast 可以帮助我,tidyr 有 pivot_wider,我认为这对我的帮助不只是 melt 和 cast。

我一直在尝试使用我的实际数据中的较小数据框作为测试代码的方法。

pivot_wider

我一开始使用的是 pivot_wider:

newdf1_test %>%
        pivot_wider(names_from = name, values_from = V4)

我得到了一个 tibble,但它只有一个参与者的 ID 和一个响应时间值

我还收到一条警告消息,指出 V4 中的值不是唯一定义的,并且我收到了有关如何绕过警告的建议。所有的建议刚刚返回给我一个数据中的错误,其中替换有 1 行,数据有 0。这到底是什么意思?

熔铸

我只是不确定它是如何工作的。当我融化数据框时,我不确定接下来要做什么,因为我看到的仍然是一个长数据框,而不是宽数据框。

melt_testdf <- melt(newdf1_test, name = c("SID", V4 = c("response_time")

我的印象是这会添加两个新变量:SID 和 response_time,这将帮助我创建两个不同的数据表,然后转置它们以使合并的数据框水平。但是,不,返回给我的新数据框显示了名称(具有参与者 ID)、仅具有值 V4 的变量(V4 是最初具有响应时间的列的名称)以及列的值响应时间最终是。

我知道我应该强制转换以进一步重塑数据,但鉴于我已经很困惑,我不想继续。

我该怎么办?我现在对此感到非常困惑,无论我读了多少书,我都无法理解。

【问题讨论】:

  • 请显示与尝试的代码和期望结果一致的示例数据。您如何确定试用? BTW - 长数据是大多数数据科学操作(聚合、建模、绘图等)的首选格式。其实是考虑tidy data
  • 在你我之间,这是你在做探索性分析时实际你的数据的格式,因为它被认为是 tidydata。尤其是如果您打算进入 r 进行分析和测试,例如回归、方差分析等。
  • 您应该能够执行spread(),只要您有每个参与者的唯一参与者 ID 和试用 id,即 trial1、trial2 等。
  • 请在您的问题中添加reproducible example
  • @HanselPalencia 这就是刚从大学毕业的志愿者 RA:高级研究人员已经知道他们想要做什么,而且没有时间告诉你。我不完全确定他们为什么想要水平数据,然后我再一次不知道垂直被认为是整洁的。我试过传播,但我得到了唯一的键组合错误。我没有试用信息,但我有帮助的参与者 ID。我只是不确定如何使它工作。

标签: r casting reshape tidyr melt


【解决方案1】:

您看到的错误是因为 pivot_wider 假设只有一行,因此它需要一种方法来聚合 V4 结果。

如果您想要多行,则需要提供一个参数或数据,让新的宽表有一种有意义的方式来指定新行。

这是我为新表提供 id 的示例:


newdf1_test <- tribble(
        ~test, ~name, ~V4,
        '001', 'Participant 1', 23,
        '002','Participant 1', 22,
        '003','Participant 1', 25,
        '001','Participant 2', 36)


newdf1_test %>%
        pivot_wider(
                names_from = name, 
                values_from = V4)

# A tibble: 3 x 3
  test  `Participant 1` `Participant 2`
  <chr>           <dbl>           <dbl>
1 001                23              36
2 002                22              NA
3 003                25              NA

在这个版本中,pivot_wider 的 cols() 参数基本上是隐含在测试变量中的。 而且您还可以看到,如果没有测试变量,新数据表就没有意义。

我希望这是有道理的!

【讨论】:

  • 确实有道理!我用来测试这段代码的数据实际上只针对一个参与者,我刚刚意识到这一点。所以。有 330 次试验,这对构建一个显示我需要的一切的新数据框有很大帮助。我看到了我遇到麻烦的地方 - 缺乏测试。现在,如果我要使用这种方法,我是否必须经过所有 330 次试验并在代码中重写它们?另外,如果我像现在使用测试数据框一样与一个参与者一起工作,这段代码是否仍然可以正常工作?因为从长远来看,这个解决方案可以帮助我获得完整的数据。
  • 好吧,如果“测试”标识符是任意的,即,如果您并不真正关心名为 test 的某个变量的值,那么您无需手动写出该信息。您可以添加行 mutate(test = row_number()) 甚至放入一个随机值生成器......然后是的,这仍然适用于一个参与者。虽然那时,您可以将 V4 重命名为“参与者 1”;相同的结果,可能会提高效率。
猜你喜欢
  • 1970-01-01
  • 2021-11-14
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2022-07-08
  • 1970-01-01
  • 2011-03-11
  • 1970-01-01
相关资源
最近更新 更多