是否有任何R函数或包来计算两个不同行同时具有相同值的列数,然后制作对角矩阵

Is there any R function or package to count number of columns that two different rows have a same value at the same time and then make diagonal matrix

我有两个问题。我有一个名为“dt”的数据集,如下所示:

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 

从这里开始,首先,我想知道有多少次不同的行在七列中同时出现一个值为“1”的值。例如,IRIN 和 IWMI 在上述环境和健康方面具有两个“1”的值。 IWMI和NetHope在健康上的价值只有一次。实际上,还有几十行。我想知道在 R 中获取数字的简单方法。同样,我想知道两个组织在七列中有多少次具有相同的值“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 矩阵中有 X12 = 2 以及 X21 = 2 的原因。并且,根据上面的第一个数据集,由于 IWMI 和 NetHope 在七列中有一次相同的值,X24 = 1 和 X42 = 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 ")