[英]Create a series of connectivity matrices in R
假设我在R中有一个数据集,指示国际组织中国家的成员资格(原始数据集可以在这里找到:IGO_stateunit_v2.3.zip)。
这是数据基本结构的示例:
cntr <- c('A','B','C','A','B','C','A','B','C')
year <- c(1990,1990,1990,1991,1991,1991,1992,1992,1992)
UNO <- c(0, 1, 1, 1, 1, 1, 1, 1, 1)
APEC <- c(0, 0, 0, 0, 0, 0,1, 1, 1 )
ASEAN <- c(0, 0, 0, 0, 1, 1, 0, 1, 1)
data <- data.frame(cntr, year, UNO, APEC, ASEAN)
因此,数据看起来像这样,其中1 =组织中的成员身份,并且可能随着时间的推移而变化:
cntr year UNO APEC ASEAN
1 A 1990 0 0 0
2 B 1990 1 0 0
3 C 1990 1 0 0
4 A 1991 1 0 0
5 B 1991 1 0 1
6 C 1991 1 0 1
7 A 1992 1 1 0
8 B 1992 1 1 1
9 C 1992 1 1 1
我想用R中的此数据创建一个矩阵,该矩阵每年计算两个国家共同拥有的成员数量。 结果应如下所示:
m.1990
A B C
A 0 0 0
B 0 0 1
C 0 1 0
m.1991
A B C
A 0 1 1
B 1 0 2
C 1 2 0
m.1992
A B C
A 0 2 2
B 2 0 3
C 2 3 0
下面是每年的代码:
data.1990 <- subset(data, year==1990, select=-c(year))
rownames(data.1990) <- data.1990$cntr
m.1990<- tcrossprod(as.matrix(data.1990[,-1]))
diag(m.1990) <- 0
data.1991 <- subset(data, year==1991, select=-c(year))
rownames(data.1991) <- data.1991$cntr
m.1991<- tcrossprod(as.matrix(data.1991[,-1]))
diag(m.1991) <- 0
data.1992 <- subset(data, year==1992, select=-c(year))
rownames(data.1992) <- data.1992$cntr
m.1992<- tcrossprod(as.matrix(data.1992[,-1]))
diag(m.1992) <- 0
我无法做的是创建一个执行这些计算的循环,并将每个结果保存到相应的矩阵中。 我也尝试过使用df_list <- split(data, as.factor(data$year))
作为第一步,但没有设法对随后的计算进行编码。
帮助将不胜感激。
您可以做这样的事情,尽管我没有尝试过多地优化您的方法
lapply(split(data, data$year), function(x) {
rownames(x) <- x$cntr
x <- tcrossprod(as.matrix(x[,-(1:2)]))
diag(x) <- 0
x})
# $`1990`
# A B C
# A 0 0 0
# B 0 0 1
# C 0 1 0
#
# $`1991`
# A B C
# A 0 1 1
# B 1 0 2
# C 1 2 0
#
# $`1992`
# A B C
# A 0 2 2
# B 2 0 3
# C 2 3 0
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.