在 R 中创建一系列连接矩阵
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
假设我在 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