2012-06-20 82 views
1

我有一个空的矩阵m一个矩阵:灌装使用数据帧中的R

m <- matrix(0, nrow = 4, ncol = 2, byrow = TRUE, 
      dimnames = list(c("sp1", "sp2", "sp3", "sp4"), 
          c("x", "y"))) 

而且需要使用数据帧d来填充矩阵

d <- data.frame(site = c("x", "y", "u", "v"), 
       species = c("sp1", "sp1", "sp1", "sp1"), 
       freq = c(0.2, 0.3, 0.5, 0.1)) 

使得如果rowname(m)等于d[, "species"]m[, "x"]等于d[, "site"]然后d[, "freq"]输入正确的地方在矩阵m即返回:

m <- matrix(c(0.2, 0, 0, 0, 0, 0, 0, 0), nrow = 4, ncol = 2, byrow = TRUE, 
      dimnames = list(c("sp1", "sp2", "sp3", "sp4"), 
          c("x", "y"))) 

我曾尝试:

m[d[, c("species", "x")]] <- d[, "freq"] 

我怀疑我是不是在做数据帧索引是否正确?有任何想法吗?谢谢。

回答

2

这可能不是做的最好办法但这是工作:

for(i in 1:nrow(d)){m[rownames(m)==d[i,2],colnames(m)==d[i,1]] <- d[i,3]} 
+0

谢谢!这工作。你会预见到它的任何稳定性问题吗? – Elizabeth

+0

我真的想不出任何。 – plannapus

1

铸造和合并的组合工作正常。

设置数据

m <- matrix(0, nrow = 4, ncol = 2, byrow = TRUE, 
      dimnames = list(c("sp1", "sp2", "sp3", "sp4"), 
          c("x", "y"))) 
d <- data.frame(site = c("x", "y", "u", "v"), 
       species = c("sp1", "sp1", "sp1", "sp1"), 
       freq = c(0.2, 0.3, 0.5, 0.1)) 

做一些计算

library(reshape) 
dc <- cast(species ~ site, data = d, value = "freq") 
md <- as.data.frame(m) 
md$species <- rownames(md) 
md <- merge(
    md, 
    dc[, c("species", "x")], 
    all.x = TRUE, 
    by = "species", 
    suffixes = c("", ".tmp")) 
md$x[!is.na(md$x.tmp)] <- md$x.tmp[!is.na(md$x.tmp)] 
md$x.tmp <- NULL 

,当您转换d $的网站包含rownames(M)

d <- data.frame(
    site = c("x", "y", "u", "v"), 
    species = factor(
     c("sp1", "sp1", "sp1", "sp1"), 
     levels = c("sp1", "sp2", "sp3", "sp4")), 
    freq = c(0.2, 0.3, 0.5, 0.1)) 
cast(species ~ site, data = d, value = "freq", add.missing = TRUE) 
的因素你可以symplify代码

你可以获得y,u和v的频率作为奖励。如果你不想让他们,从DA先验

cast(species ~ site, data = d, value = "freq", add.missing = TRUE, 
    subset = site == "x") 

删除它们使用填充参数是要NA转换到另一个值

cast(species ~ site, data = d, value = "freq", add.missing = TRUE, 
    subset = site == "x", fill = 0) 
+0

谢谢!我最终使用plannapus的答案,因为它更短。你的版本是否更稳定? – Elizabeth

+0

我已添加到代码简化代码。这一切都取决于m是否已经定义或者是否可以从d创建m。 – Thierry