bugfix> r > 投稿

次のように、2つのベクトルで「list.paired」と呼ばれるexpand.gridで作成したデータフレームがあります。

              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に保存されたデータを参照します。例えば。、:

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 件
  • ネストされた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 になります  ベクトルを2つの別々の行列 m1 に  および m2  そして、 cor(m1,m2) を実行します 。 cor のドキュメントによると :xとyが行列の場合、xの列とyの列の間の共分散(または相関)が計算されます。

  • cor(measure1、measure2)はcor(measure2、measure1)と同じであり、cor(measure1、measure1)は1であるため、このアプローチには多くの冗長性があると思います。

    このアプローチはうまくいくでしょうか?

    # 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]]))
    
    

  • 以下のデータフレームを想定しています:

    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) だけです ?

あなたの答え