我有data.frame
:
df <- read.table(text= " section to from time
a 1 5 9
a 2 5 9
a 1 5 10
a 2 6 10
a 2 7 11
a 2 7 12
a 3 7 12
a 4 7 12
a 4 6 13 ", header = TRUE)
每行标识时间点to
中from
和time
中同时出现的ID。基本上是to
和from
中的时间显式网络ID。
我想知道哪些to
ID在from
的特定时间范围内共享2
个ID。在其他方面,我想知道to
中的ID 1和2是否都在两天之内到达咖啡店5
,即
1
2
中的to
和5
from
time
1
分别为from
9和10 1}}时间窗口内的共享事件2.如果他们在时间点13也共享 a 1 5 9
a 2 5 9
a 1 7 13
a 2 7 13
个ID,例如
1
然后2
和2
将获得df
所以我希望 section to.a to.b noShared
a 1 2 1
a 2 3 1
a 2 4 1
a 3 4 1
的最终输出是:
library(plyr)
library(tnet)
a <- ddply(df, .(section,to,time), function(x)
data.frame(from = unique(x$from)) )
b <- ddply(a, .(section,time), function(x) {
b <- as.tnet(x[, c("to","from")], type="binary two-mode tnet")
b <- projecting_tm(b, method="sum")
return(b)
})
我可以通过以下方式获得一些方法:
to
这可以让我了解from
点time
内的b
个共享ID中的哪些ID。
但ids
有两个主要问题。
首先在每个时间点内, 1 2 5 9 # id 1 and 2 went to coffee shop 5 at time 9
2 1 5 9 # id 2 and 1 went to coffee shop 5 at time 9
I only want each sombination to appear once:
1 2 5 # id 1 and 2 went to coffee shop 5 at time 9</strike>
对在两个方向上出现两次,即
{{1}}
其次我需要在时间窗口中对结果进行分区,这样我的最终结果就不会只是共享事件的数量,例如
修改
时间问题比预期的问题多。第一个问题就足够了。
答案 0 :(得分:2)
生成b(问题的第一部分)
我改变了代码projecteing_tm
,这是网络的转型。
b <- ddply(a, .(section,time), function(x) {
## first I create the origin network
net2 <- x[, c("to","from")]
colnames(net2) <- c('i','p')
net2 <- net2[order(net2[, "i"], net2[, "p"]), ]
np <- table(net2[, "p"])
net2 <- merge(net2, cbind(p = as.numeric(rownames(np)),np = np))
## trasnformed network
net1 <- merge(net2, cbind(j = net2[, "i"], p = net2[, "p"]))
net1 <- net1[net1[, "i"] != net1[, "j"], c("i", "j","np")]
net1 <- net1[order(net1[, "i"], net1[, "j"]), ]
index <- !duplicated(net1[, c("i", "j")])
net1 <- cbind(net1[index, c("i", "j")])
net1
})
所以在这里你得到你的b没有任何警告
> b
section time i j
1 a 9 1 2
2 a 9 2 1
3 a 12 2 3
4 a 12 2 4
5 a 12 3 2
6 a 12 3 4
7 a 12 4 2
8 a 12 4 3
对于问题的第二部分,您要删除b中的重复吗?
b[!duplicated(t(apply(b[3:4], 1, sort))), ]
section time i j
1 a 9 1 2
3 a 12 2 3
4 a 12 2 4
6 a 12 3 4
对于这部分,我在这里使用这个question的答案。