r - 当存在关联时如何用 1 和 0 填充矩阵

标签 r matrix fill

我一直在尝试从 R 中的数据帧创建矩阵,但没有成功。我有下一个数据框

Order        Object      idrA   idoA
8001505892  CHR56029398AB   1   1
8001506013  CHR56029398AB   1   2
8001507782  CHR56029398AB   1   3
8001508088  CHR56029398AB   1   4
8001508788  CHR56029398AB   1   5
8001509281  CHR56029398AB   1   6
8001509322  CHR56029398AB   1   7
8001509373  CHR56029398AB   1   8
8001505342  MMRMD343563     2   9
8001506699  MMRMD343563     2   10
8001507102  MMRMD343563     2   11
8001507193  MMRMD343563     2   12
8001508554  MMRMD343563     2   13
8001508654  MMRMD343563     2   14
8001509151  MMRMD343563     2   15
8001509707  MMRMD343563     2   16
8001509712  MMRMD343563     2   17
8001509977  MMRMD343563     2   18
8001510279  MMRMD343563     2   19
8001505342  MMRMD343565     3   9
8001507112  MMRMD343565     3   20
8001507193  MMRMD343565     3   12
8001508554  MMRMD343565     3   13
8001508654  MMRMD343565     3   14
8001509151  MMRMD343565     3   15
8001509707  MMRMD343565     3   16
8001509712  MMRMD343565     3   17
8001509977  MMRMD343565     3   18
8001510279  MMRMD343565     3   19
8001505920  MMRMN146319     4   21
8001506733  MMRMN146319     4   22
8001506929  MMRMN146319     4   23
8001507112  MMRMN146319     4   20
8001507196  MMRMN146319     4   24
8001510302  MMRMN146319     4   25
8001517272  MMRMN146319     4   26
8001506186  MMRMN146320     5   27
8001506733  MMRMN146320     5   22
8001506929  MMRMN146320     5   23
8001507112  MMRMN146320     5   20
8001508638  MMRMN146320     5   28
8001509526  MMRMN146320     5   29
8001505452  SSR664050011    6   30
8001508551  SSR664050011    6   31
8001509229  SSR664050011    6   32
8001510174  SSR664050011    6   33

其中 idr 是每个对象的 Id,ido 是每个采购订单的 Id。所以我想制作一个矩阵,行数 = N° 订单,N° 列 = N°对象,并用带有 1 和 0 的向量填充它,当每个订单购买一些对象时用 1 填充如果不是,则为 0。

示例:ido=20 的订单必须具有类似 (0,0,1,1,1,0) 的向量。

希望能解释清楚,谢谢!

最佳答案

您可以使用xtabs创建交叉表:

重新创建您的数据:

dat <- read.table(header=TRUE, text="
                  Order        Object      idrA   idoA
                  8001505892  CHR56029398AB   1   1
                  ....
                  8001506013  CHR56029398AB   1   2
                  8001507782  CHR56029398AB   1   3
                  8001509229  SSR664050011    6   32
                  8001510174  SSR664050011    6   33")

创建交叉表:

xtabs(Order ~ idoA + idrA, dat) != 0

    idrA
idoA     1     2     3     4     5     6
  1   TRUE FALSE FALSE FALSE FALSE FALSE
  2   TRUE FALSE FALSE FALSE FALSE FALSE
  ....
  20 FALSE FALSE  TRUE  TRUE  TRUE FALSE
  ....
  32 FALSE FALSE FALSE FALSE FALSE  TRUE
  33 FALSE FALSE FALSE FALSE FALSE  TRUE

要将逻辑值强制转换为数值,您可以使用 apply()as.numeric,但是您还需要做一些工作来替换行名称:

 apply(xtabs(Order ~ idoA + idrA, dat) != 0, 2, as.numeric)

或者,您可以使用一些小技巧,将 0 添加到值中。这会将逻辑值强制转换为数字:

 (xtabs(Order ~ idoA + idrA, dat) != 0) + 0

    idrA
idoA 1 2 3 4 5 6
  1  1 0 0 0 0 0
  2  1 0 0 0 0 0
  3  1 0 0 0 0 0
....

关于r - 当存在关联时如何用 1 和 0 填充矩阵,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/26829132/

相关文章:

r - 用带孔的多边形制作 sf 对象并设置 crs

r - 如何从 emacs-ess 中的 R 访问 bash 环境变量

c++ - std::accumulate() 只是复数 std::vector 的实部

wpf - 居中 WPF 控件

r - 从第一个方括号中提取一个字符串,从右到左开始

r - 单击 Shiny 应用程序中的网络节点后更新数据表

matlab - 如何根据特定行条件的最小值返回整列?

matlab - 查找矩阵内的索引位置

javascript - HTML5 Canvas - 如何 fill() 一个特定的上下文

java - 无法设置填充颜色 Apache POI Excel 工作簿