【问题标题】:Filling a matrix using a dataframe in R使用 R 中的数据框填充矩阵
【发布时间】:2012-06-20 08:57:23
【问题描述】:

我有一个空矩阵m:

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"]

我怀疑我没有正确地进行数据框索引?有任何想法吗?谢谢。

【问题讨论】:

    标签: r matrix indexing dataframe


    【解决方案1】:

    这可能不是最好的方法,但这是有效的:

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

    【讨论】:

    • 谢谢!这行得通。但是,您是否预见到任何稳定性问题?
    • 我真的想不出。
    【解决方案2】:

    强制转换和合并可以正常工作。

    设置数据

    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$site 转换为包含 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)
    

    作为奖励,您可以获得 y、u 和 v 的频率。如果您不想要它们,请先验地删除它们

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

    如果您想将 NA 转换为另一个值,请使用 fill 参数

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

    【讨论】:

    • 谢谢!我最终使用了 plannapus 的答案,因为它更短。你的版本更稳定吗?
    • 我已将简化代码添加到代码中。这完全取决于 m 是否已经定义或者您是否可以从 d 创建 m。
    猜你喜欢
    • 2018-09-03
    • 1970-01-01
    • 2014-07-28
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2021-10-02
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多