如何使用dplyr操纵长表数据进行关联,但不将数据转换为宽格式

索伦·奥尼尔

我有一些数据代表患者(id)的重复(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    |

我想对来自会话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)。

阿克伦

我们可以尝试dplyrdata.table方法。假设我们想找到'var'列的相关性,我们使用grep('nm1')和自定义函数(f1创建列的索引我们使用Mapdo用于获取cor每个“变种”列。我们使用“ var”列作为第一个输入,即“ x”和“ session”作为“ y”。

nm1 <- grep('^var', names(data))
f1 <- function(x,y) cor(x[y=='A'], x[y=='B']) 
library(dplyr)
data %>% 
      do({data.frame(Map(f1, .[nm1], list(.$session)))})
#   var.1 var.2
#1    -1     1

以类似的方式,我们可以cor使用using data.table

library(data.table)
setDT(data)[, Map(f1, .SD[, nm1, with=FALSE], list(session)) ]
#   var.1 var.2
#1:    -1     1

如果我们正在使用 base R

mapply(f1, data[nm1], list(data$session))
# var.1 var.2 
# -1     1 

如果要转换为wide格式,可以使用dcastdevel版本的data.tableie,v1.9.5因为它可以占用多value.var列。

 dW <- dcast(setDT(data), id~session, value.var=c('var.1', 'var.2'))[, id:=NULL]
 dW
 #   var.1_A var.1_B var.2_A var.2_B
 #1:     1.1     1.9      11      12
 #2:     1.2     1.4      15      14

我们可以转换为matrix,子集,应用cor并获取diag值。

 m1 <- as.matrix(dW)
 diag(cor(m1[,c(TRUE, FALSE)], m1[,c(FALSE, TRUE)]))
 #[1] -1  1

数据

data <- structure(list(id = c(1L, 1L, 2L, 2L), var.1 = c(1.1, 1.9, 1.2, 
1.4), var.2 = c(11L, 12L, 15L, 14L), session = c("A", "B", "A", 
"B")), .Names = c("id", "var.1", "var.2", "session"), 
class = "data.frame", row.names = c(NA, -4L))

本文收集自互联网,转载请注明来源。

如有侵权,请联系 [email protected] 删除。

编辑于
0

我来说两句

0 条评论
登录 后参与评论

相关文章

如何将数据从长格式转换为宽格式

使用 SQL 将宽格式数据转换为长格式

如何在熊猫中将长数据格式转换为宽数据格式

将长格式的分组数据转换为宽格式

将分类数据从长格式转换为宽格式

在数据框中从长格式转换为宽格式

将数据从长格式转换为宽格式

使用melt()将宽数据转换为需要值查找的长数据格式

如何在H2O中将数据从长格式转换为宽格式?

如何将 R 数据从长格式转换为宽格式

R - 使用多个值列将数据帧从长格式转换为宽格式

非典型数据格式从长转换为宽

在长格式数据框中使用不带列名的熔化将宽格式转换为长格式

如何在熊猫中将长数据转换为宽数据?

如何在Stata中将长数据转换为宽数据?

如何在Pandas中将宽日期数据转换为长格式

如何通过多个变量(列)将长格式数据转换为宽格式数据并相互堆叠?

当变量的子集相互关联时,如何将宽格式转换为长格式?

使用 Pandas 将数据帧从长转换为宽

如何将数据帧从长到宽转换,但不使用因子和不等长的关联

将数据集从“宽”格式转换为“长”格式,并将时间列转换为时间格式以进行时间序列分析

使用R中多个“关键”列中的值将数据帧从长格式复杂转换为宽格式

R计算百分比而不将数据帧转换为宽数据帧并返回长数据帧

将数据框从长格式转换为宽格式并动态命名列

将长格式数据帧转换为宽格式但保留 R 中的列数

R:以宽格式向数据添加信息并将其转换为长格式的最佳实践

使用dplyr将数据框和列表转换为长格式

使用 dplyr 将“开始停止数据”(又名转码)转换为长格式(又名时间码)

如何将面板数据转换为特定的宽格式?