簡體   English   中英

從函數和兩個數字數據框創建矩陣

[英]Create a matrix from a function and two numeric data frames

我正在嘗試在R中創建各種距離/關聯函數的矩陣。我有一個類似於cor的函數,它給出了兩個向量之間的關聯。 現在我想采用數字向量的數據幀(或矩陣),比如mtcars ,並從函數和數據框創建一個矩陣。 我認為這是outer東西,但我沒有讓它發揮作用。 這是使用cor和mtcars的嘗試。

cor(mtcars$mpg, mtcars$cyl)  #a function that gives an association between two vectors                  
outer(mtcars, mtcars, "cor") #the attempt to create a matrix of all vectors in a df

是的我知道cor可以直接做到這一點,讓我們假裝它不能。 cor只是找到兩個向量之間的相關性。

所以最終的目標是獲得你從cor(mtcars)獲得的矩陣。

先感謝您。

您可以使用帶有列名稱或列號作為參數的函數的outer

outer(
  names(mtcars), 
  names(mtcars), 
  Vectorize(function(i,j) cor(mtcars[,i],mtcars[,j]))
)

outer並不直接取決於工作。 它只會擴展其XY向量並調用cor一次。 編輯正如@Vincent Zoonekynd所示,您可以使其適應工作。

否則,一個相當簡單的循環就可以了:

m <- as.matrix(mtcars)
r <- matrix(1, ncol(m), ncol(m), dimnames=list(colnames(m), colnames(m)))
for(i in 1:(ncol(m)-1)) {
  for(j in (i+1):ncol(m)) {
     r[i,j] <- cor(m[,i], m[,j])
     r[j,i] <- r[i,j]
  }
}

all.equal(r, cor(m)) # Sanity check...

r # print resulting 11x11 correlation matrix

...這里我假設您的相關性是對稱的,而cor(x,x)== 1

更新由於文森特的解決方案更優雅,我不得不反對我的速度快2倍的事實:-)

# Huge data frame (1e6 rows, 10 cols)
d <- data.frame(matrix(1:1e7, ncol=10))

# Vincent's solution    
system.time(outer(
  names(d), 
  names(d), 
  r <- Vectorize(function(i,j) cor(d[,i],d[,j]))
)) # 2.25 secs

# My solution    
system.time({
m <- d
r <- matrix(1, ncol(m), ncol(m), dimnames=list(colnames(m), colnames(m)))
for(i in 1:(ncol(m)-1)) {
  for(j in (i+1):ncol(m)) {
     r[i,j] <- cor(m[,i], m[,j])
     r[j,i] <- r[i,j]
  }
}
}) # 1.0 secs

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM