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

问题描述

我有两个问题。我有一个名为“ 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 

首先,从这里开始,我想知道两个不同的行同时在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 ")