首页 > 解决方案 > 寻找一种使我的数据在 R 中水平的方法

问题描述

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

任务本身进行了多次试验,这使得数据看起来杂乱无章——尤其是现在,因为我最初的工作是将所有数据合并到一个数据框中。在数据的垂直方向上,我们可以看到参与 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)

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

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

熔铸

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

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

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

我知道我应该进行投射以进一步重塑数据,但鉴于我已经感到困惑,我不想继续。

我是什么做的?我现在对此感到非常困惑,无论我读了多少书,我都没有得到任何结果。

标签: rcastingreshapetidyrmelt

解决方案


您看到的错误是因为 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() 参数隐含在测试变量中。而且您还可以看到,如果没有测试变量,新数据表在某种程度上是有意义的。

我希望这是有道理的!


推荐阅读