我有一些数据代表患者(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)。
我们可以尝试dplyr
或data.table
方法。假设我们想找到'var'列的相关性,我们使用grep
('nm1')和自定义函数(f1
)创建列的索引。我们使用Map
中do
用于获取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
格式,可以使用dcast
devel版本的data.table
ie,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] 删除。
我来说两句