2012-02-14 69 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