我拥有往返的移动数据,并且想说一下某个位置的信息,例如,从位置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对此具有某些功能,所以也许有人可以按正确的方向发送给我,这将非常有帮助。
答案 0 :(得分:3)
您拥有的是图形数据。每个位置称为顶点或节点(它们是可互换的),而您要计算的数量称为 degree 一个节点。 “流入度”是流入的总量,“流出度”是流出的总量。总体而言,“学位”是两者之和。
可能有两种解决方案:
我将同时演示两者。
第一个解决方案使用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)