gpt4 book ai didi

r - 如何使用 dplyr 操作长表数据以进行关联,但无需将数据转置为宽格式

转载 作者:行者123 更新时间:2023-12-02 04:55:21 25 4
gpt4 key购买 nike

我有一些数据代表患者 (id) 的重复( session A 和 B)测量 (var.x)。我的数据很整洁(即长格式表,每列中有一个变量,每行有一个观察值)...就像这样:

| id | var.1 | var.2 | session |
--------------------------------
| 1 | 1.1 | 11 | A |
| 1 | 1.9 | 12 | B |
| 2 | 1.2 | 15 | A |
| 2 | 1.4 | 14 | B |

我想对 session A 和 B 中的配对(按 id)数据(例如 var.1)进行相关性分析。换句话说,重复测量之间的相关系数是多少。

这并不难做到,如果我将数据转置/旋转/融化/传播为宽格式,如下所示:

| id | var.1.A | var.2.A | var.1.B | var.2.B |
----------------------------------------------
| 1 | 1.1 | 11 | 1.9 | 12 |
| 2 | 1.2 | 15 | 1.4 | 14 |

...然后我可以简单地 cor(var.1.A, var.1.B)。我意识到 dplyr/tidyr 有为此目的收集/传播/分离/联合命令,但是这对我来说似乎不整洁且不够优雅,因为我基本上必须复制我的数据。

有没有办法使用 dplyr 来做到这一点,而不需要重新调整数据?

我正在思考以下内容:

data %>% 
select(id, var.1, session) %>%
do( cor( filter(session=='A', filter(session=='B'))

...但显然这不起作用,我还需要以某种方式指定数据是配对的(通过 id)。

最佳答案

我想我应该添加一个答案,展示如何使用 dplyr 中的 summarise_each 来执行此操作。

此方法取决于数据集顺序。在这种情况下,我喜欢使用 arrange 来确保数据集处于所需的顺序,尽管如果您确信事情已经按顺序排列,则可以跳过此操作。

data %>%
arrange(id, session) %>%
summarise_each(funs(cor(.[session == "A"], .[session == "B"])), starts_with("var"))

var.1 var.2
1 -1 1

summarise_each 中,. 指的是您要汇总的变量,而在 do 中,它指的是数据集。

您可以简单地按名称写出要汇总的变量,但我使用函数 starts_with 来选择变量。有关这些特殊功能的更多信息,请参阅 select 的帮助页面。

您还需要确保每个 ID 中都有一对。如果您遇到 id 中缺少一个 session 级别的情况,tidyr 包中的 complete 函数可能会很有用。如果是这种情况,您可能需要在 cor 中使用 use 参数。

关于r - 如何使用 dplyr 操作长表数据以进行关联,但无需将数据转置为宽格式,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/32392197/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com