2012-02-14 65 views
2

我有一個零矩陣m和一個包含要插入到m中的記錄的數據幀df。R:在將記錄插入矩陣時避免循環

# fix seed ------------------------------------------- 
set.seed(0)  

# create m, matrix of zeros -------------------------- 
rnames <- seq(1, 100, 1) 
m <- matrix(0, length(rnames), length(letters), 
     dimnames=list(rnames, letters)) 

# create df of random records ------------------------ 
r <- sample(rnames, 10, replace=TRUE) 
c <- sample(letters, 10, replace=TRUE) 
q <- runif(10, -10, 10) 
df <- data.frame(r, c, q) 

# want to insert df$q at r,c in m -------------------- 

我能做到這一點,而不訴諸一個循環?最乾淨的方法是什麼?

+0

爲了使其具有可重複性,您應該在第一個「樣本」之前的任意位置設置種子值,例如, 'set.seed(0)'。 – Iterator 2012-02-14 14:13:52

+0

@iterator好主意 - 將編輯 – kfmfe04 2012-02-14 14:27:47

回答

5

將指示矩陣轉換爲m

index <- cbind(
    row = df$r, 
    col = match(df$c, colnames(m))  
) 

m[index] <- df$q 
+0

工程太棒了! tyvm – kfmfe04 2012-02-14 14:29:33

+0

(+1)這就是要走的路。 (我應該在發佈之前測試我的解決方案:) – chl 2012-02-14 14:31:36