是否有任何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 ")
我有两个问题。我有一个名为“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 ")