在R中的两个矢量数据帧的每个单元格之间执行相关,其中每个单元格引用另一个数据帧中的矢量名称

时间:2018-05-25 08:08:15

标签: r loops correlation

我有一个用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中的每对变量。我真的很感激任何建议。

3 个答案:

答案 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您的向量分为两个单独的矩阵m1m2,然后运行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)