【问题标题】:in R: Two Way Match to Matrix在 R 中:与矩阵的双向匹配
【发布时间】:2016-06-10 15:20:53
【问题描述】:

如果我有一个 data.frame

df <- data.frame(DEP=letters[1:5], ARR=letters[11:15], NO=1:5+5)

   DEP ARR  NO
1   a   k   6
2   b   l   7
3   c   m   8
4   d   n   9
5   e   o  10

我想创建一个DEP为ROW ID,ARR为COL ID的矩阵,并用相关匹配的NO填充矩阵...

例如

  k l m n o
a 6 7 8 9 10 ...etc

每个组合都是独一无二的。

DEP 和 ARR 是同一个名称向量。为了清楚起见,我在这里选择了两个不同的示例。

我正在努力使用 match 对它们进行排序并将它们填充到我在下面创建的矩阵模板中:

mat <- matrix(0,nrow(df),nrow(df)); colnames(mat) <- df$ARR; rownames(mat) <- df$DEP;

  k l m n o
a 0 0 0 0 0
b 0 0 0 0 0
c 0 0 0 0 0
d 0 0 0 0 0
e 0 0 0 0 0

有没有一种有效的方法来做到这一点?非常感谢所有建议!

【问题讨论】:

    标签: r matrix


    【解决方案1】:

    ?xtabs:

    xtabs(NO ~ ., data=df)
    #   ARR
    #DEP  k  l  m  n  o
    #  a  6  0  0  0  0
    #  b  0  7  0  0  0
    #  c  0  0  8  0  0
    #  d  0  0  0  9  0
    #  e  0  0  0  0 10
    

    【讨论】:

      【解决方案2】:

      如果我正确理解了您的问题,您可以使用稀疏矩阵定义:

      library(Matrix)
      mat <- spMatrix(length(df$DEP), length(df$ARR), 
                      seq(df$DEP), seq(df$ARR), as.numeric(as.character(df$NO)))
      rownames(mat) <- df$DEP
      colnames(mat) <- df$ARR
      #> as.matrix(mat)
      #  k l m n  o
      #a 6 0 0 0  0
      #b 0 7 0 0  0
      #c 0 0 8 0  0
      #d 0 0 0 9  0
      #e 0 0 0 0 10
      

      【讨论】:

      • 如果有很多0,使用稀疏矩阵可能最有意义
      • 非常感谢!尝试稀疏矩阵。我有一个错误:无效的类“dgTMatrix”对象:TsparseMatrix 中的所有列索引(插槽'j')必须介于 0 和 ncol-1 之间。试图解决它。
      • 类是一个因素。我试过用同样的错误转换它。你有什么推荐的?
      • 谢谢!我认为我们在垫子上缺少一个支架
      • 此错误表明df$NO 存储为因子类。为了解决这个问题,我们可以将df$NO 包装成as.numeric(as.character())(见编辑)。希望这会有所帮助。
      猜你喜欢
      • 2017-03-19
      • 2016-07-27
      • 1970-01-01
      • 2018-05-18
      • 1970-01-01
      • 2021-07-07
      • 2016-08-05
      • 2019-12-10
      • 1970-01-01
      相关资源
      最近更新 更多