我有一份个人,慈善机构和年份的名单。我想知道在给定的慈善机构和年份中,个人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之外做这件事。
答案 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])