Warning: file_get_contents(/data/phpspider/zhask/data//catemap/1/cocoa/3.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
R 创建重叠矩阵_R_Matrix_Social Networking_Stata - Fatal编程技术网

R 创建重叠矩阵

R 创建重叠矩阵,r,matrix,social-networking,stata,R,Matrix,Social Networking,Stata,我有一份个人、慈善机构和年份的清单。我试图找出在给定的慈善机构和年份中,个人I与个人j重叠的次数。我想每年做一个正方形矩阵,让任何给定的单元格告诉我重叠的数量 数据示例: Individual Year Charity 1 2003 A 2 2003 A 2 2003 B 2 2005 A ... ... ..

我有一份个人、慈善机构和年份的清单。我试图找出在给定的慈善机构和年份中,个人
I
与个人
j
重叠的次数。我想每年做一个正方形矩阵,让任何给定的单元格告诉我重叠的数量

数据示例:

Individual    Year    Charity
    1         2003       A
    2         2003       A
    2         2003       B
    2         2005       A
   ...        ...       ...
   17         2003       A
   17         2003       B
2003年通缉结果(每年):

我听说R最适合网络数据,但现在使用Stata,我为每个个体创建了一个变量,然后运行一个
if语句
,该语句在给定列中查找个体的
[\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之外做这件事。

我最近做了类似的事情。首先,添加一个包含年度和慈善的专栏。然后将数据框转换为每个人的慈善机构列表。我调用了您的数据示例
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])
  })
})
这与您期望的输出不同,它给出了每个人参加的活动数量,而不是
,我认为这很重要,因为每个人参加的活动数量不同


如果你每年都需要它的子集数据帧,并且对每个子集重复。

< P>作为一种选择,你可能需要考虑基准测试。首先,将所有三胞胎制成表格(根据个人当年是否向慈善机构捐款,条目将为1或0):


你所说的“个人
i
与个人
j
重叠多少次”到底是什么意思?您能否发布一个具有代表性的初始数据示例,您希望它看起来如何,以及它们的链接描述?(你是缺少单个大括号还是应该是嵌套循环?@RobertoFerrer这是一个打字错误,我添加了数据和想要的结果。你是否试图构建一个由慈善机构每年联系起来的个人的社会矩阵(或社会图)?@GaryWeissman是的,按年。如果这是一个很好的矩阵,但我假设它必须是每年一个。你能解释一下第一行是做什么的吗?活动的总数是一个很好的添加,Thanks添加了一个包含年份和慈善的列,它成为第4列,然后放入列表中并用于检查重叠。如果你按年完成,你就不需要那一行了,你需要在列表循环中从第4列改为第3列。太好了!最后一件事,是否可以通过一个时间指示符来完成,并为每个时间指示符输出一个单独的表,或者我是否必须按子集向它提供子集?因此,我只加载了一年的数据集。我有列:个人、慈善机构和年份,删除了代码的第一行,我收到一个错误
唯一错误(x$Individual):未找到对象“x”
我称你的示例数据为x,我不知道你称你的数据为什么,但是如果你把它叫做
dat
,那么在它出现的两个地方用
dat$Individual
替换
x$Individual
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
tbl <- table(dat$Individual, dat$Charity, dat$Year)
res <- apply(tbl, 3, function(x) x %*% t(x))
dim(res) <- c(dim(tbl)[1], dim(tbl)[1], dim(tbl)[3])