使用来自其他矩阵的数据函数的值填充矩阵

时间:2017-05-19 10:17:09

标签: r matrix

我有一个关于在R中使用矩阵的问题 - 请原谅我是否有任何笨拙或不清楚 - 我仍然是R初学者。

我有2个矩阵结构如下:

整数值组织到组织矩阵,表示组织之间的有价值关系:

orgorg <- matrix(sample.int(50, 5*5, TRUE), 5, 5)
colnames(orgorg) <- colnames(orgorg, do.NULL = FALSE, prefix = "org")
rownames(orgorg) <- rownames(orgorg, do.NULL = FALSE, prefix = "org")

和组织的二元人,表明哪些人属于哪些组织:

personorg <- matrix(sample(0:1,10*5, replace=TRUE),10,5)
colnames(personorg) <- colnames(personorg, do.NULL = FALSE, prefix = "org")
rownames(personorg) <- rownames(personorg, do.NULL = FALSE, prefix = "per")

我创建了第三人称对象矩阵,如下所示:

 npep=length(unique(rownames(personorg)))
 personperson <- matrix(0, npep, npep)

我想以下列方式填充此矩阵的元素:

对于personperson矩阵[person i,person j]中的每个元素,我想查找每个人所属的组织(来自personorg矩阵),然后使用orgorg中的值填写该元素这些组织的矩阵。

因此,例如,如果person1是org2的成员而person2是org4的成员,则[per1,per2]的personperson矩阵中的元素将是[org2,org4]的orgorg矩阵中的元素。

如果元素[i,j]由多个组织的成员组成,那么我希望元素中填充平均值&#39;距离&#39;这些人所属的组织之间。 因此,例如,如果人8是org2和org4的成员,而人9是org 1的成员,并且

orgorg[org1, org2] = 12
orgorg[org1, org4] = 10

然后

personperson[per8,per9] = 11

我希望这很清楚!谢谢!

1 个答案:

答案 0 :(得分:0)

你的问题非常有趣。我尝试了一个解决方案,制作了两个新功能并完成了for循环。请尝试使用此代码并告诉我它是否适合您。

# Preamble
orgorg <- matrix(sample.int(50, 5*5, TRUE), 5, 5)
colnames(orgorg) <- colnames(orgorg, do.NULL = FALSE, prefix = "org")
rownames(orgorg) <- rownames(orgorg, do.NULL = FALSE, prefix = "org")

personorg <- matrix(sample(0:1,10*5, replace=TRUE),10,5)
colnames(personorg) <- colnames(personorg, do.NULL = FALSE, prefix = "org")
rownames(personorg) <- rownames(personorg, do.NULL = FALSE, prefix = "per")

npep=length(unique(rownames(personorg)))
personperson <- matrix(0, npep, npep)

rownames(personperson) <- rownames(personorg)
colnames(personperson) <- rownames(personorg)

# combine_custom function
combine_custom <- function(per1, per2, mat){
  one <- mat[per1,]
  one <- names(one)[one!=0]

  two <- mat[per2,]
  two <- names(two)[two!=0]

  if( (length(one) != 0 && length(one) == 1) | (length(two) != 0 && length(two) == 1) ){
    combinations <- combn(c(one, two), 2)
  } else {
    combinations <- matrix(0, 2, 1)
    for(i in 1:length(one)){
      combinations <- cbind(combinations, combn(c(one[i], two), 2))
    }
    combinations <- combinations[,-1]
  }

  combinations <- unique(combinations, MARGIN=2)
}


# ext function
ext <- function(x, mat){
  y <- mat[x[1],x[2]]
  y
}

# For loop
for(i in rownames(personperson)){
  for(j in colnames(personperson)){
    personperson[i,j] <- mean(apply(combine_custom(i, j, personorg), 2, function(x) ext(x=x, mat=orgorg)))
  }
}