我有一个关于在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
我希望这很清楚!谢谢!
答案 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)))
}
}