我有一个用expand.grid创建的数据框,名为“list.paired”,带有两个向量,如下所示:
Var1 Var2
1 measure1 measure1
2 measure2 measure1
3 measure3 measure1
4 measure4 measure1
5 measure5 measure1
6 measure6 measure1
7 measure7 measure1
8 measure2 measure2
9 measure2 measure3
10 ... and so on, detailing every combination of the 7 variables
每个度量指的是另一个数据帧中的向量。例如,longdata $ measure1。
例如,要引用longdat $ measure1,我可以使用以下代码:
eval(parse(text = paste("longdat$",list.paired[1,1], sep =""))
我想创建一个循环,在list.paired的每个组合之间执行相关,其中它指的是存储在longdat中的数据。 。e.g,:
x = eval(parse(text = paste("longdat$",list.paired[2,1],".long", sep =""))) #longdat$measure2
y = eval(parse(text = paste("longdat$",list.paired[2,2],".long", sep =""))) #longdat$measure1
cor(x, y)
到目前为止,我还没有成功设计一个循环来循环遍历list.paired中的每对变量。我真的很感激任何建议。
答案 0 :(得分:0)
您可以使用嵌套for循环:
for (vm1 in list.paired$Var1) {
for(vm2 in list.paired$Var2) {
x = eval(parse(text = paste("longdat$",vm1,".long", sep =""))) #longdat$measure2
y = eval(parse(text = paste("longdat$",vm2,".long", sep =""))) #longdat$measure1
cor(x, y)
}
}
但这会相当缓慢。更快捷的方法是将cbind
您的向量分为两个单独的矩阵m1
和m2
,然后运行cor(m1,m2)
。根据{{1}}的{{3}}:如果x和y是矩阵,则计算x列和y列之间的协方差(或相关性)。
答案 1 :(得分:0)
我认为这种方法有很多冗余,因为cor(measure1,measure2)与cor(measure2,measure1)相同而cor(measure1,measure1)是1.实际上你只有21个独特的组合((7选择2) ))。
这种方法有效吗?
# your long data
df<- data.frame(col1 = runif(100),col2 = runif(100),col3 = runif(100),col4 =
runif(100),col5 = runif(100),col6 = runif(100),col7 = runif(100))
# your vector with correlations between unique combinations of columns
cor.vec <- apply(combn(7,2), 2, function(idx) cor(df[,idx[1]],df[,idx[2]]))
答案 2 :(得分:0)
假设以下数据帧:
list.paired <- data_frame(
Var1 = str_c("measure", rep(1:3, each = 3)),
Var2 = str_c("measure", rep(1:3, 3))
)
longdat <- data_frame(
measure1 = rnorm(10),
measure2 = rnorm(10),
measure3 = rnorm(10)
)
循环选项可以是:
results <- list()
for (v1 in list.paired$Var1)
for (v2 in list.paired$Var2) {
results <- c(results, cor(longdat[v1], longdat[v2]))
names(results[[length(results)]]) <- paste(v1, "*", v2)
}
或者使用purrr
包(mapply
可以做同样的事情):
purrr:pmap(
list.paired,
function(Var1, Var2) {
res <- cor(longdat[[Var1]], longdat[[Var2]])
names(res) <- paste(Var1, "*", Var2)
return(res)
}
)
但也许你所需要的只是cor(longdat)
?