我在R中有以下由节点组成的网络:
SELECT ADD_MONTHS(TRUNC(SYSDATE,'YEAR'),-1) FROM DUAL;
------------------------------OUTPUT--------------------------------------------
ADD_MONTHS(TRUNC(SYSDATE,'YEAR'),-1)
12/01/2015
------------------------------OUTPUT--------------------------------------------
以下列表描述了以节点' 4'
结尾的所有路径"39336" "19054" "32644" "52356" "14095" "18221" "12237" "61278" "34703" "15780" "33148" "54104" "5816" "92819" "4"
每个子列表描述一个路径,从第一个元素开始,到#4;'结束。例如,第4条路径从节点19054开始,转到52356,然后在4结束。
我想要做的是捕获节点参与从给定起始节点开始的路径的次数。
例如,如果我们查看启动路径的节点,我们有:
p
[[1]]
[1] 52356 61278 19054 15780 19054 61278 19054
[[2]]
[1] 15780 19054 32644 14095 12237 19054 14095
[[3]]
[1] 32644 15780 19054 32644 12237 19054
[[4]]
[1] 19054 52356
[[5]]
[1] 19054 15780 19054 52356 61278 32644 34703 39336
[[6]]
[1] 39336 61278
[[7]]
[1] 19054 52356 61278 32644 34703 61278 18221
[[8]]
[1] 32644 18221 14095 32644 15780 39336
[[9]]
[1] 33148 18221 33148 14095 32644 12237 32644 61278
[[10]]
[1] 12237 14095 52356 12237 39336 61278
[[11]]
[1] 15780 34703 15780 34703 15780 19054
[[12]]
[1] 12237 52356 61278 12237 39336 19054 61278
[[13]]
[1] 52356 54104 32644 19054 61278 19054
[[14]]
[1] 54104 39336 61278 19054 61278 32644 39336
[[15]]
[1] 5816 54104 32644 52356 19054 52356
[[16]]
[1] 5816 19054 39336
[[17]]
[1] 19054 54104 5816 19054 52356 19054
因此,对于由节点54104启动的那条路径,我想要为所有涉及的节点授予“1'”的分数。换句话说,我想得到一个像这样的表:
其中我使用了符号(n(i,j,X))来表示从i开始的路径数,以X结尾并涉及j。我有以下尝试:
rapply(p, function(x) { head(x, 1)})
5816 12237 15780 19054 32644 33148 39336 52356 54104
2 2 2 4 2 1 1 2 1
这里的错误是节点ID是整数,因此我不能使用id作为参考将它们放在15x15矩阵中。如何将ID映射到整数1-15,以便我可以跟踪每个路径中发生的节点,并能够映射回来并给出作为初始节点ID的矩阵的rownames / colnames ?
答案 0 :(得分:1)
我认为一种逻辑方法是将id值的索引用于规范id向量作为结果矩阵的行和列索引。
match()
功能在这里很有帮助。您可以将节点ID与规范id向量进行匹配,以检索该向量中的索引,然后可以将其用作结果矩阵中的行或列索引。要向后映射,您可以简单地使用行索引或列索引作为向量下标来索引规范id向量,以检索原始节点ID。
以下是如何做到这一点:
m <- matrix(0L,length(ids),length(ids),dimnames=list(from=ids,involved=ids));
for (pi in seq_along(p)) { ## iterate over all paths; pi is the path index into p
involved <- p[[pi]][-1L]; ## get the subvector of node ids involved in (but not starting) the path
involvedUnique <- unique(involved); ## get the unique involved ids in occurrence order
involvedCount <- tabulate(match(involved,involvedUnique)); ## get their counts
ri <- match(p[[pi]][1L],ids); ## compute the implicit row index of the starting node
cis <- match(involvedUnique,ids); ## compute the implicit column indexes of the involved nodes
m[ri,cis] <- m[ri,cis]+involvedCount; ## accrue the counts onto the result matrix
}; ## end for
m;
## involved
## from 39336 19054 32644 52356 14095 18221 12237 61278 34703 15780 33148 54104 5816 92819 4
## 39336 0 0 0 0 0 0 0 1 0 0 0 0 0 0 0
## 19054 1 3 2 4 0 1 0 3 2 1 0 1 1 0 0
## 32644 1 2 2 0 1 1 1 0 0 2 0 0 0 0 0
## 52356 0 5 1 0 0 0 0 3 0 1 0 1 0 0 0
## 14095 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
## 18221 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
## 12237 2 1 0 2 1 0 2 3 0 0 0 0 0 0 0
## 61278 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
## 34703 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
## 15780 0 3 1 0 2 0 1 0 2 2 0 0 0 0 0
## 33148 0 0 2 0 1 1 1 1 0 0 1 0 0 0 0
## 54104 2 1 1 0 0 0 0 2 0 0 0 0 0 0 0
## 5816 1 2 1 2 0 0 0 0 0 0 0 1 0 0 0
## 92819 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
## 4 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
数据强>
ids <- c(39336L,19054L,32644L,52356L,14095L,18221L,12237L,61278L,34703L,15780L,33148L,54104L,
5816L,92819L,4L);
p <- list(c(52356L,61278L,19054L,15780L,19054L,61278L,19054L),c(15780L,19054L,32644L,14095L,
12237L,19054L,14095L),c(32644L,15780L,19054L,32644L,12237L,19054L),c(19054L,52356L),c(19054L,
15780L,19054L,52356L,61278L,32644L,34703L,39336L),c(39336L,61278L),c(19054L,52356L,61278L,
32644L,34703L,61278L,18221L),c(32644L,18221L,14095L,32644L,15780L,39336L),c(33148L,18221L,
33148L,14095L,32644L,12237L,32644L,61278L),c(12237L,14095L,52356L,12237L,39336L,61278L),c(
15780L,34703L,15780L,34703L,15780L,19054L),c(12237L,52356L,61278L,12237L,39336L,19054L,61278L
),c(52356L,54104L,32644L,19054L,61278L,19054L),c(54104L,39336L,61278L,19054L,61278L,32644L,
39336L),c(5816L,54104L,32644L,52356L,19054L,52356L),c(5816L,19054L,39336L),c(19054L,54104L,
5816L,19054L,52356L,19054L));
我应该澄清一下,我将尺寸名称和标签添加到结果矩阵中纯粹是出于美学目的。当然可以在索引操作中使用维度名称作为下标,因此可以通过在索引时将它们强制转换为字符值来将id值本身用作下标,但我建议不要这样做。我不认为在任何地方使用as.character()
胁迫是一种非常干净的方法,它可能导致棘手的并发症。例如,如果您发现自己处于预先字符串化的id值可能具有稍微不同的字符串表示形式的情况下,例如无关的空格,digit group separators或前导零,则可能导致索引失败。