【问题标题】:R: Accessing elements of a matrix using a separate coordinate matrixR:使用单独的坐标矩阵访问矩阵的元素
【发布时间】:2014-10-09 23:22:36
【问题描述】:

我有一个当前用零填充的矩阵 (expTrans)。我有第二个矩阵(expCoor),其中第二列用列名填充,第三列用行号填充。我想使用第二个矩阵中的坐标将第一个矩阵中的一些元素更改为 1。当我使用此代码时,R 用 1 填充提到的每一列中提到的每一行(列相同):

expTrans<-matrix(0, nrow(cashflows), ncol(dmat))
colnames(expTrans)<-substr(colnames(dmat),4,6)
expTrans[expCoor[,3],colnames(expenses)[expCoor[,1]]]<-1

有没有办法只改变每个坐标指定的行和列,而不必遍历整个矩阵?

这是一个简单的例子来说明我在说什么:

> m<-matrix(0,ncol=10,nrow=10)
> colnames(m)<-c("a","b","c","d","e","f","g","h","i","j")
> m
      a b c d e f g h i j
 [1,] 0 0 0 0 0 0 0 0 0 0
 [2,] 0 0 0 0 0 0 0 0 0 0
 [3,] 0 0 0 0 0 0 0 0 0 0
 [4,] 0 0 0 0 0 0 0 0 0 0
 [5,] 0 0 0 0 0 0 0 0 0 0
 [6,] 0 0 0 0 0 0 0 0 0 0
 [7,] 0 0 0 0 0 0 0 0 0 0
 [8,] 0 0 0 0 0 0 0 0 0 0
 [9,] 0 0 0 0 0 0 0 0 0 0
[10,] 0 0 0 0 0 0 0 0 0 0
> ind<-cbind(sample(1:10,10),sample(1:10,10), c("a","a","b","j","c","d","e", "a", "b", "b"))
> ind
      [,1] [,2] [,3]
 [1,] "4"  "8"  "a" 
 [2,] "2"  "9"  "a" 
 [3,] "9"  "3"  "b" 
 [4,] "3"  "1"  "j" 
 [5,] "7"  "4"  "c" 
 [6,] "10" "7"  "d" 
 [7,] "8"  "6"  "e" 
 [8,] "1"  "2"  "a" 
 [9,] "6"  "5"  "b" 
[10,] "5"  "10" "b" 
> m[as.numeric(ind[,1]),ind[,3]]<-1
> m
      a b c d e f g h i j
 [1,] 1 1 1 1 1 0 0 0 0 1
 [2,] 1 1 1 1 1 0 0 0 0 1
 [3,] 1 1 1 1 1 0 0 0 0 1
 [4,] 1 1 1 1 1 0 0 0 0 1
 [5,] 1 1 1 1 1 0 0 0 0 1
 [6,] 1 1 1 1 1 0 0 0 0 1
 [7,] 1 1 1 1 1 0 0 0 0 1
 [8,] 1 1 1 1 1 0 0 0 0 1
 [9,] 1 1 1 1 1 0 0 0 0 1
[10,] 1 1 1 1 1 0 0 0 0 1

我希望 a 列有 3 个 1(第 4、2、8 行),b 列有 3 个 1(第 9、6、5 行),c 列有 1 个 1(第 7 行),d 列有1 1(第 10 行),e 列有 1 1(第 8 行),j 列有 1 1(第 3 行)。

【问题讨论】:

  • 您能否提供一个简化的数据示例?目前你有expTranscashflowsdmatexpensesexpCoor。所有这些都是代表您的问题所必需的吗?我不知道你想做什么。
  • 另外,您说expCoor 中的 2nd 列包含您的列名。那为什么在列索引的最后一行代码中引用expCoor[,1] 而不是expCoor[,2]

标签: r matrix


【解决方案1】:

有一种方法可以将两列数字矩阵用于“[”或“[

> expTrans<-matrix(0, 3,4);expTrans
     [,1] [,2] [,3] [,4]
[1,]    0    0    0    0
[2,]    0    0    0    0
[3,]    0    0    0    0
> dmat <- matrix( c(1,3,4,2,2,2),ncol=3, byrow=TRUE);dmat
     [,1] [,2] [,3]
[1,]    1    3    4
[2,]    2    2    2
> colnames(expTrans)<- colnames(dmat); rownames(expTrans) <-rownames(dmat)
> expTrans[cbind(dmat[,2],dmat[,3] )] <- dmat[,1]
> expTrans
     [,1] [,2] [,3] [,4]
[1,]    0    0    0    0
[2,]    0    2    0    0
[3,]    0    0    0    1
> ?'['

修改后问题的解法:

> m[cbind( as.numeric(ind[,1]), match( ind[,3], colnames(m) ) ) ] <- 1
> m
      a b c d e f g h i j
 [1,] 0 1 0 0 0 0 0 0 0 0
 [2,] 0 1 0 0 0 0 0 0 0 0
 [3,] 0 0 0 1 0 0 0 0 0 0
 [4,] 1 0 0 0 0 0 0 0 0 0
 [5,] 0 0 0 0 0 0 0 0 0 1
 [6,] 0 1 0 0 0 0 0 0 0 0
 [7,] 0 0 0 0 1 0 0 0 0 0
 [8,] 1 0 0 0 0 0 0 0 0 0
 [9,] 0 0 1 0 0 0 0 0 0 0
[10,] 1 0 0 0 0 0 0 0 0 0

【讨论】:

  • 好的。提供的解决方案。记住... 数字
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2013-05-14
  • 1970-01-01
  • 2014-05-03
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多