1

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

每行标识一个 id 在某个时间点tofrom在某个时间点同时出现time。基本上是一个时间明确的 id 网络tofrom.

我想知道哪些id 在特定时间范围内to共享一个id,即. 在其他情况下,我想知道 ids 1 和 2 是否在两天内都去咖啡店。,即from2to5

id12in toshared id分别在59和 10 ,因此将 在时间窗口 2 内共享事件。如果他们还在时间点 13 共享 id,例如fromtime1from

                             a     1  5        9       
                             a     2  5        9        
                             a     1  7        13       
                             a     2  7        13       

然后12得到一个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共享 ID 中的哪些 ID。fromtime

但是,有两个主要问题b

首先在每个时间点内,这对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> 

其次,我需要在时间窗口内对结果进行分类,以便我的最终结果没有时间只是共享事件的数量,即


编辑

时间问题的问题比预期的要多。对于这个问题,第一个问题就足够了。

4

1 回答 1

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

对于这一部分,我在这里使用这个问题的答案。

于 2012-12-29T12:16:55.320 回答