匹配进出位置数据

时间:2018-10-12 11:08:01

标签: r data.table

我拥有往返的移动数据,并且想说一下某个位置的信息,例如,从位置1进出多少东西。

test = data.table(day = c(1,1,1), from = c(1,2,1), to =c(3,1,3))
test[ , `:=`( total_from = .N) , by = c("day", "from") ]
test[ , `:=`( total_to = .N) , by = c("day", "to") ]


   day from to total_from total_to
1:   1    1  3          2        2
2:   1    2  1          1        1
3:   1    1  3          2        2

我不能简单地添加两个总计列,因为它们与同一位置无关。 我最好的结果是:

   day location count
1:   1        1     3
2:   1        2     1
3:   1        3     2

我不知道要搜索什么,因为我很确定R对此具有某些功能,所以也许有人可以按正确的方向发送给我,这将非常有帮助。

1 个答案:

答案 0 :(得分:3)

您拥有的是图形数据。每个位置称为顶点节点(它们是可互换的),而您要计算的数量称为 degree 一个节点。 “流入度”是流入的总量,“流出度”是流出的总量。总体而言,“学位”是两者之和。

可能有两种解决方案:

  1. 如Jaap的评论所述,通过重塑数据并求和来计算度数和度数
  2. 使用图形库构造图形并有效地计算度数。

我将同时演示两者。

重塑

第一个解决方案使用data.table中的“重塑”功能,因为您已经在使用该软件包:

test <- data.table(
    day = c(1,1,1),
    from = c(1,2,1),
    to = c(3,1,3)
)

您的数据当前为“宽”格式:您的两列是彼此的变体,即在指定日期流入或流出节点的数量。

test_long <- melt(test, id.vars = "day", variable.name = "direction", value.name = "location")

melt将此数据重塑为“长”格式:您有一列指示位置,另一列指示方向。现在,您可以通过简单地按日期和位置进行分组并计算每个组的实例数来获得答案:

test_totals <- test_long[, .N, by = .(day, location)]

图分析

幸运的是,data.table对于“ groupby”操作非常有效。

但是,图形数据结构通常更灵活,更高效。 igraph是一个功能强大且易于使用的图形分析软件包,由完善的C库支持。

library(igraph)


test <- data.table(
    day = c(1,1,1),
    from = c(1,2,1),
    to = c(3,1,3)
)

# the first 2 columns must be the vertices; each row is an edge
# other columns are treated as edge attributes
g <- graph.data.frame(test[, .(from, to, day)]

# returns a named vector of degree for each node
totals <- degree(g)