【发布时间】: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 行)。
【问题讨论】:
-
您能否提供一个简化的数据示例?目前你有
expTranscashflowsdmatexpenses和expCoor。所有这些都是代表您的问题所必需的吗?我不知道你想做什么。 -
另外,您说
expCoor中的 2nd 列包含您的列名。那为什么在列索引的最后一行代码中引用expCoor[,1]而不是expCoor[,2]?