r - 基于组和时间的值的共现(矩阵)

标签 r matrix dplyr

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

  1. 每个人的协作总数
  2. 每个人合作过的不同个人的总数
  3. 现有团队中重复协作的总数

一堆问题 - 1 , 2 , 3 , 4 - 与此相关,但似乎没有使用两个不同的标准。我改编了给出的数据示例 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 合作。

对于每个IDi我要的,总数IDj (j <> i) 和谁 IDi合作 Trx焦点项目之前 z(比如 3)年内的项目。另外,我想要不同合作者的数量(例如,A 和 B 在 3 年间隔内的 2 次合作仅计为 1)。最后,我需要重复的关系。为了简约,可以排除所有零值。我的真实数据有40000多个ID,90000多个项目,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人合作。与 B (Trx3、Trx4) 合作 2 次,与 E (Trx4) 合作 1 次,因此总计 = 3,差异 = 2。在当前团队成员(B 和 F)中,C 之前与 F 合作过 0 次,与 B 合作过 2 次在 3 年窗口内(重复 = 2)。

这个问题与我问的另一个问题几乎相同here ,但我希望这里更清楚。

最佳答案

给你:

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))

}`

关于r - 基于组和时间的值的共现(矩阵),我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/34150763/

相关文章:

r - 在传单中绘制 shp 文件,适用于 ggplot

matrix - 如何在 TensorFlow 中更改变量的形状?

C++ 11 binary_search 和 lambda 函数用例

r - 计算与其他列的双重类别关联的列中的特定字符。根据频率仓迭代进行

保留一个重复行

c++ - 使用 R CMD SHLIB 编译 C++ 文件时如何指定标题搜索路径?

使用深度名称向量作为索引替换嵌套列表

r - 为什么 S4 继承在环境之间丢失?

python - 列表理解选定的索引

r - 将字符串拆分为行和列