基于组和时间的值的共同出现(矩阵)

时间:2015-12-08 08:00:55

标签: r matrix dplyr

我正在寻求确定特定人(ID)在给定年份之前的预定时间间隔内合作的次数。理想情况下,解决方案可以提供三件事:

  1. 每个人的合作总数
  2. 每个人与
  3. 合作的不同人的总数
  4. 现有团队中重复协作的总数
  5. 一大堆问题 - 1234 - 与此相关,但似乎没有使用两个不同的标准。我调整了here给出的数据示例,并由@trinker解决。

    dat <- read.table(text="Group ID Time
    Trx1 A 1980
    Trx1 B 1980
    Trx1 C 1980
    Trx2 E 1980
    Trx2 B 1980
    Trx3 B 1981
    Trx3 C 1981
    Trx4 C 1983
    Trx4 E 1983
    Trx4 B 1983
    Trx5 F 1984
    Trx5 B 1984
    Trx5 C 1984
    Trx6 A 1986", header=T) 
    

    因此,在1980年,有两个项目Trx1Trx2。在第一个中,A,B和C合作,在第二个中,E和B合作。

    对于我想要的每个IDiIDj(j&lt;&gt; i)与z IDi项目中Trx项目合作的总人数(比如说) 3)焦点项目前几年。此外,我想要不同协作者的数量(例如,3年间隔内A和B之间的2次协作仅计为1)。最后,我需要重复的关系。对于简约性,可以排除所有零值。我的真实数据有超过40,000个ID,超过90,000个项目,以及超过50年。 结果应如下所示:

    ID  year total diff repeat
    B   1981    3   3   1
    C   1981    2   2   1
    B   1983    4   3   3 *
    C   1983    3   2   2
    E   1983    1   1   1
    B   1984    3   2   2
    C   1984    3   2   2 **
    

    说明:

    • 1983年之前,B与C合作两次,A合作一次,E合作一次(总列数= 4)。只有一个与C的合作对第四列很重要(diff = 3)。对于最后一列,我计算与当前团队成员重复协作的次数。 B在Trx1和Trx3处与C一起工作并且在Trx2处与E一起工作,因此重复= 3

    ** C在1981年至1983年间(3年间隔,排除,1980年)合作,总共3人。 2个合作是B(Trx3,Trx4),1个是E(Trx4),因此总数= 3,diff = 2.在当前团队成员(B和F)中,C先前与F合作为零,2与B合作在3年的窗口中(重复= 2)。

    这个问题与我提到的另一个问题here完全相同,但我希望这里更清楚。

1 个答案:

答案 0 :(得分:2)

你走了:

library(data.table)
library(magrittr)
options(stringsAsFactors = F)

dat <- read.table(text="Group ID Time
Trx1 A 1980
Trx1 B 1980
Trx1 C 1980
Trx2 E 1980
Trx2 B 1980
Trx3 B 1981
Trx3 C 1981
Trx4 C 1983
Trx4 E 1983
Trx4 B 1983
Trx5 F 1984
Trx5 B 1984
Trx5 C 1984
Trx6 A 1986", header=T) 

str(dat)
dat = as.data.table(dat)

priorYears = 3
unqIDs = unique(dat$ID)


results = data.table(ID = character(), year = numeric(), total = numeric(), diff = numeric(), repeatSum = numeric())

for(i in 1:nrow(dat)){

  endYear = dat$Time[i] 
  startYear = endYear - priorYears
  this.ID = dat$ID[i]
  this.group = dat$Group[i]

  #Dates filtering
  subset.DT = dat[dat$Time >= startYear & dat$Time < endYear] 

  # Keep projects where my current ID collaborated 
  groupsToKeep = subset.DT$Group[subset.DT$ID == this.ID] %>% unique
  subset.DT = subset.DT[subset.DT$Group %in% groupsToKeep,]


  # Calculations
  unqMembers = unique(subset.DT$ID) %>% .[. != this.ID]
  currentMembers = dat$ID[dat$Group == this.group] %>% .[. != this.ID]

  total = length(which(subset.DT$ID != this.ID))
  diff = length(unqMembers)
  repeatSum = sum(table(subset.DT$ID)[currentMembers], na.rm = T)

  # Add results
  results = rbind(results, data.frame(ID = this.ID, year = endYear, total, diff, repeatSum))

}`