【问题标题】:Creating an overlap matrix创建重叠矩阵
【发布时间】:2014-04-30 02:21:42
【问题描述】:

我有一份个人、慈善机构和年份的清单。我试图找出在给定的慈善机构和年份中个人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 之外这样做。

【问题讨论】:

  • “个人i 与个人j 重叠多少次”到底是什么意思?您能否发布一个具有代表性的初始数据示例、您希望它的外观以及对它们的链接的描述? (您是否缺少单个大括号或者那些应该是嵌套循环?)
  • @RobertoFerrer 这是一个错字,我添加了数据并想要结果
  • 您是否正在尝试构建每年通过慈善机构联系的个人的社会矩阵(或社交图)?
  • @GaryWeissman 是的,按年计算。如果这可以是一个很棒的矩阵,但我认为它必须是每年一个。

标签: r matrix social-networking stata


【解决方案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

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

如果您希望每年对数据帧进行子集,并为每个子集重复。

【讨论】:

  • 你能解释一下第一行是做什么的吗?事件总数是一个很好的补充,谢谢
  • 添加一个结合年份和慈善的列,它变成第4列,然后放入列表中并用于检查重叠。如果您按年进行,则不需要该行,并且需要在列表制作循环中从第 4 列更改为第 3 列。
  • 太棒了!最后一件事,是否可以通过时间指示器来完成,并为每个输出一个单独的表,或者我必须一个子集一个子集地喂它
  • 另外我只加载了一年的数据集。我有以下列:个人、慈善和年份,删除了代码的第一行,我收到错误 Error in unique(x$Individual) : object 'x' not found
  • 我将您的示例数据称为 x,我不知道您如何称呼您的数据,但如果您将其称为 dat,则在它出现的两个地方将 x$Individual 替换为 dat$Individual
【解决方案2】:

作为替代方案,您可能需要考虑对以下内容进行基准测试。首先,将所有三胞胎制成表格(条目将是 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])

【讨论】:

    猜你喜欢
    • 2020-03-23
    • 1970-01-01
    • 2020-12-28
    • 2017-09-18
    • 1970-01-01
    • 2017-08-25
    • 2019-04-10
    • 2018-10-19
    • 1970-01-01
    相关资源
    最近更新 更多