-1

我有一个包含犯罪实例的数据集,每个实例都有一个位置 (wardId)、犯罪类型 (Primary.Type) 和日期。最终目标是将其转变为以 Primary.Type 作为节点的网络,其边的权重取决于它们共享 Primary.Type 和 Ward.Date 的独特组合的次数(两种类型的犯罪发生在当天同一个病房是一个连接,这个组合当天发生的次数决定权重)。

在 Ward.Date 上合并后,wardId 和 Date我有一个包含 Ward.Date('wardId yyyy-mm-dd')、Primary.Type.x('string')、Primary.Type.y('string')的edgelist,重量(数字)。Primary.Types 源自合并重复表以创建边缘列表,因此存在反向重复。

病房日期 主要类型.x 主要类型.y 重量
1 2017-01-03 盗窃 抢劫 1
1 2017-01-03 抢劫 盗窃 1
2 2017-01-05 电池 入室盗窃 2
2 2017-01-05 入室盗窃 电池 2

在一些帮助下(使用 R 删除反向重复)我设法删除了 Primary.Type.x 和 Primary.Type.y 的反向重复值,它们具有相同的 Ward.Date 值:

      test <- edgelist.primary.wards[!duplicated(lapply(as.data.frame(t(edgelist.primary.wards), 
          stringsAsFactors=FALSE), sort)),]

但是需要注意的是,结果表也删除了反向对的权重,而此计数未汇总到保留的对的权重中:

病房日期 主要类型.x 主要类型.y 重量
1 2017-01-03 盗窃 抢劫 1
2 2017-01-05 入室盗窃 电池 2

相反,目标输出应该是:

病房日期 主要类型.x 主要类型.y 重量
1 2017-01-03 盗窃 抢劫 2
2 2017-01-05 入室盗窃 电池 4

期待看到您的建议!

4

1 回答 1

0

您可以使用of对列中的值和Primary.Type.x数据进行排序。Primary.Type.ysummarisesumWeight

library(dplyr)

edgelist.primary.wards %>%
  group_by(Ward.Date, 
           Type1 = pmin(Primary.Type.x, Primary.Type.y), 
           Type2 = pmax(Primary.Type.x, Primary.Type.y)) %>%
  summarise(Weight = sum(Weight, na.rm = TRUE)) -> result

result

这也可以用基数 R 写为:

aggregate(Weight~Ward.Date + Type1 + Type2, transform(edgelist.primary.wards, 
          Type1 = pmin(Primary.Type.x, Primary.Type.y), 
          Type2 = pmax(Primary.Type.x, Primary.Type.y)), sum, na.rm = TRUE)
于 2021-03-09T02:26:59.527 回答