计算共享事件并删除重复项

时间:2012-12-29 11:59:57

标签: r plyr

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

每行标识时间点tofromtime中同时出现的ID。基本上是tofrom中的时间显式网络ID。

我想知道哪些to ID在from的特定时间范围内共享2个ID。在其他方面,我想知道to中的ID 1和2是否都在两天之内到达咖啡店5,即

<{1}} 1 2中的to5 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

然后22将获得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

这可以让我了解fromtime内的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}}

其次我需要在时间窗口中对结果进行分区,这样我的最终结果就不会只是共享事件的数量,例如


修改

时间问题比预期的问题多。第一个问题就足够了。

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的答案。