总结忽略方向性的一对事件

时间:2017-03-27 20:19:34

标签: r igraph

鉴于某些事件,例如人们坐在桌子周围,我想将这些事件概括为对的频率。换句话说,两个元素连续/连接的频率是多少?扭曲的是A BB A应该算作两个,因为我感兴趣的是A只在B之前出现在一起。示例数据:

events <- list()
events[["week_1"]] <- c("A", "B", "C")
events[["week_2"]] <- c("A", "B")
events[["week_3"]] <- c("A", "C", "B")

从中我可以创建pairs of elements

createPairs <- function(x){
    data.frame(cbind(x[-length(x)], x[-1]))
}
pairs_l <- lapply(events, createPairs)
pairs <- do.call("rbind", pairs_l)
pairs

week_1.1  A  B
week_1.2  B  C
week_2    A  B
week_3.1  A  C
week_3.2  C  B

问题在于汇总,它将两列考虑在内,但按照一定的顺序:

library(plyr)
pairs_count <- ddply(pairs,.(X1, X2),nrow)
pairs_count

  X1 X2 V1
1  A  B  2
2  A  C  1
3  B  C  1
4  C  B  1

注意第3和第4行。这些是棘手的,我想一起总结,以便最后:

  X1 X2 V1
1  A  B  2
2  A  C  1
3  B  C  2

我尝试了多种摘要/聚合策略,但都失败了。

最终游戏是什么?我想创建一个使用igraph坐在一起的人的网络,为此数据需要采用类似于(随机示例)的格式:

>   from  to weight      type
> 1  s01 s02     10 hyperlink
> 2  s01 s02     12 hyperlink
> 3  s01 s03     22 hyperlink
> 4  s01 s04     21 hyperlink
> 5  s04 s11     22   mention
> 6  s05 s15     21   mention

或作为邻接矩阵。

1 个答案:

答案 0 :(得分:2)

您可以使用dplyr执行此操作。我不得不改变你的功能以禁止因素。然后,我在这个新数据上使用pminpmax以及summarise创建了一个密钥:

events <- list()
events[["week_1"]] <- c("A", "B", "C")
events[["week_2"]] <- c("A", "B")
events[["week_3"]] <- c("A", "C", "B")

createPairs <- function(x){
    data.frame(cbind(x[-length(x)], x[-1]), stringsAsFactors=FALSE)  #changes
}
pairs_l <- lapply(events, createPairs)
pairs <- do.call("rbind", pairs_l)

pairs %>%
rowwise() %>%
mutate(key = paste0(pmin(X1, X2), pmax(X1, X2), sep = "")) %>%
group_by(key) %>%
summarise(X1=min(X1, X2),X2=max(X1, X2),total.count=n())

    key    X1    X2 total.count
  <chr> <chr> <chr>       <int>
1    AB     A     B           2
2    AC     A     C           1
3    BC     B     C           2