问题描述
Name of general security environment health humanrights Tradecommerce finance
organization
IRIN 0 1 1 1 1 0 0
IWMI 1 0 1 1 0 0 0
Asyl 0 0 0 0 1 0 0
NetHope 0 0 0 1 0 0 0
USC 0 0 1 0 0 0 0
CIFAL 1 0 1 0 1 0 0
首先,从这里开始,我想知道两个不同的行同时在7列中具有“ 1”的值的次数。例如,在上面的环境和健康方面,IRIN和IWMI两次具有“ 1”的值。 IWMI和NetHope仅在健康方面具有一次价值。实际上,有更多行。我想知道在R中获取数字的简便方法。再次,我想知道两个组织在7列中具有“ 1”的相同值的次数。
第二,通过具有数字,然后,我想基于将组织中具有“ 1”的值配对在一起的数字来创建对角矩阵。
例如,像这样:
Name IRIN IWMI Asyl NetHope USC CIFAL
of organization
IRIN 0 2 1 1 1 2
IWMI 2 0 0 1 1 2
Asyl 1 0 0 0 0 1
NetHope 1 1 0 0 0 1
USC 1 1 0 0 0 1
CIFAL 2 2 1 1 1 0
为描述矩阵,正如我在上面解释的那样,IRIN和IWMI在七个列中两次具有相同的值“ 1”。这就是为什么在6 * 6矩阵中存在X 12 = 2以及X 21 = 2的原因。并且,由于根据上面的第一个数据集,IWMI和NetHope在七个列中一次具有相同的值,因此X 24 = 1和X 42 = 1也是如此。因此,我想知道如何根据数字制作对角矩阵。
总体而言,我有50多个组织,我想首先了解R函数或有关如何计算两个不同行同时具有“ 1”值的列数的代码。其次,一旦找到数字,我想知道如何基于两个组织之间的七个列中相同值“ 1”的数字来制作对角矩阵。
我希望有人能理解这个复杂的问题并找到解决方法。
祝一切顺利
乐华
解决方法
尝试一下:
myfunc <- function(i,j,data,nm = "organization") {
sum(
unlist(subset(data,data[[nm]] == i,select = names(data) != nm)) == 1 &
unlist(subset(data,data[[nm]] == j,select = names(data) != nm)) == 1
)
}
res <- outer(setNames(nm = unique(dat$organization)),setNames(nm = unique(dat$organization)),Vectorize(myfunc,vectorize.args = c("i","j")),data = dat)
diag(res) <- 0 # otherwise,diag(res) is 7,since IRIN==IRIN
res
# IRIN IWMI Asyl NetHope USC CIFAL
# IRIN 0 2 1 1 1 2
# IWMI 2 0 0 1 1 2
# Asyl 1 0 0 0 0 1
# NetHope 1 1 0 0 0 0
# USC 1 1 0 0 0 1
# CIFAL 2 2 1 0 1 0
数据:
dat <- read.table(header=TRUE,text="
organization general security environment health humanrights tradecommerce finance
IRIN 0 1 1 1 1 0 0
IWMI 1 0 1 1 0 0 0
Asyl 0 0 0 0 1 0 0
NetHope 0 0 0 1 0 0 0
USC 0 0 1 0 0 0 0
CIFAL 1 0 1 0 1 0 0 ")