【问题标题】:From asymmetric matrix (or dataframe) into a symmetric square matrix with R从非对称矩阵(或数据帧)到 R 的对称方阵
【发布时间】:2013-03-22 00:39:50
【问题描述】:

给定这个data.frame:'sample',它代表物种之间的成对输赢:

     sp1<-c(0,1,0)
     sp3<-c(1,2,2)
     sp5<-c(3,1,0)
     sample<-as.data.frame(cbind(sp1,sp3,sp5))
     rownames(sample)<-c("sp1","sp6","sp8")

应该是这样的:

    sp1 sp3 sp5
sp1   0   1   3
sp6   1   2   1
sp8   0   2   0

如何修改“sample”,使其具有与行名相同的列名,反之亦然,并用零填充添加的列或行,以使数据框对称,如下所示? (我更喜欢数据框,因为我怕我不擅长矩阵):

    sp1 sp3 sp5 sp6 sp8
sp1   0   1   3   0   0
sp3   0   0   0   0   0
sp5   0   0   0   0   0
sp6   1   2   1   0   0
sp8   0   1   0   0   0

真实数据大约有 150 行和列,所以我真的不想要 用excel手动完成。这种格式是应用与竞争物种相互作用结果有关的其他一些函数所必需的(列:获胜,行:损失)。

【问题讨论】:

    标签: r dataframe symmetric


    【解决方案1】:

    您显示的输出似乎不是 对称 矩阵,但如果您正在寻找所需的输出,这里有一种方法可以使用 stackxtabs。制作“方形”矩阵的关键是确保行名和列名被“分解”。

    ## Extract and sort the unique combination of row and column names.
    ## This will be used when creating our factors.
    NAMES <- sort(unique(c(rownames(sample), colnames(sample))))
    ## "stack" your data.frame, reintroducing the rownames
    ##   which get dropped in the stacking process
    temp <- data.frame(rows = rownames(sample), stack(sample))
    ## Your stacked data looks like this:
    temp
    #   rows values ind
    # 1  sp1      0 sp1
    # 2  sp6      1 sp1
    # 3  sp8      0 sp1
    # 4  sp1      1 sp3
    # 5  sp6      2 sp3
    # 6  sp8      2 sp3
    # 7  sp1      3 sp5
    # 8  sp6      1 sp5
    # 9  sp8      0 sp5
    
    ## Factor the row and column names
    temp$rows <- factor(temp$rows, NAMES)
    temp$ind <- factor(temp$ind, NAMES)
    
    ## Use xtabs to get your desired output. Wrap it in
    ##    as.data.frame.matrix to get a data.frame as output
    as.data.frame.matrix(xtabs(values ~ rows + ind, temp))
    #     sp1 sp3 sp5 sp6 sp8
    # sp1   0   1   3   0   0
    # sp3   0   0   0   0   0
    # sp5   0   0   0   0   0
    # sp6   1   2   1   0   0
    # sp8   0   2   0   0   0 
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2017-03-29
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2022-12-14
      • 1970-01-01
      • 2016-10-05
      相关资源
      最近更新 更多