创建重叠矩阵

时间:2014-04-30 02:21:42

标签: r matrix social-networking stata

我有一份个人,慈善机构和年份的名单。我想知道在给定的慈善机构和年份中,个人i与个人j重叠的次数。我想每年制作一个方阵,让任何给定的单元格告诉我重叠的数量。

数据示例:

Individual    Year    Charity
    1         2003       A
    2         2003       A
    2         2003       B
    2         2005       A
   ...        ...       ...
   17         2003       A
   17         2003       B

2003年的结果(每年):

    Individual       Individual_1    Individual_2    ...       Individual_17
        1                 .               1                      1
        2                 1               .                      2
       ...               ...             ...                    ...
        17                1               2                      .

我听说R最适合网络数据,但是现在使用Stata,我为每个人创建了一个变量,然后我运行if statement,在[_n+x]单元格中查找在给定列中的个体并放置一个。然后我将汇总这些数据。这似乎有效,但是非常耗费时间,我确信可能会有错误。

qui forval j = 1/1750 { 
gen individual_`j'= 0
}

qui forval j = 1/1750 {
replace individual_`j' = 1 if individual[_n+`j'] == 1 & year == 2002 & charity == "A"
}

qui forval j = 1/1750 {
replace individual_`j' = 1 if individual[_n+`j'] == 1 & year == 2003 & charity == "A"
}

qui forval j = 1/1750 {
replace individual_`j' = 1 if individual[_n+`j'] == 1 & year == 2004 & charity == "A"
}

qui forval j = 1/1750 {
replace individual_`j' = 1 if individual[_n+`j'] == 1 & year == 2005 & charity == "A"
}

然后我会对每个慈善机构进行总结。这些蛮力工作的数据太多了,希望有一种更简单的方法。

我愿意在Stata之外做这件事。

2 个答案:

答案 0 :(得分:1)

我最近做了类似的事情。首先添加一个结合年份和慈善事业的列。然后将数据框转换为每个人的慈善机构列表。我打电话给你的数据x

的例子
x$info <- paste(x$Year,x$Charity,sep="_")
All_Groups.list <- vector(length(unique(x$Individual)),mode="list")
names(All_Groups.list) <- as.character(unique(x$Individual))
for (i in 1:length(All_Groups.list)) {
  All_Groups.list[i] <- list(c(as.character(x[x$Individual == names(All_Groups.list)[i],4])))
}
Self.Cor.table <- sapply(All_Groups.list, function(x) {
  sapply(All_Groups.list,function(y){
length(x[x %in% y])
  })
})

输出是一个相关表,其中数字计算有人参与事件的重叠

> Self.Cor.table
   1 2 17
1  1 1  1
2  1 3  2
17 1 2  2

这与您想要的输出不同,它给出了每个人参加的活动的数量而不是.,我认为这很重要,因为每个人都会参加不同数量的活动。

如果您希望每年按年度对数据框进行子集化,并对每个子集重复一次。

答案 1 :(得分:0)

作为替代方案,您可能需要考虑对以下内容进行基准测试。首先,将所有三胞胎制成表格(条目将为1或0,具体取决于个人是否在该年度为慈善机构捐款):

tbl <- table(dat$Individual, dat$Charity, dat$Year)

现在我们想循环遍历每一年(这是tbl的第三维),并且对于每对行(个体),计算共享1的数量。实现如下:

res <- apply(tbl, 3, function(x) x %*% t(x))
dim(res) <- c(dim(tbl)[1], dim(tbl)[1], dim(tbl)[3])