总结忽略方向性的事件对
Summarize pair of occurrences ignoring directionality
给定某些事件,例如人们坐在一起 table,我想将这些总结为成对出现的频率。也就是说,两个元素出现的频率是多少consecutively/adjoined?转折点是 A B
和 B 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
我尝试了多种 summarization/aggregation 策略,但都失败了。
结局是什么?我想创建一个使用 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
或作为邻接矩阵。
你可以用 dplyr
做到这一点。我不得不改变你的功能来禁止因素。然后,我使用 pmin
和 pmax
以及 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
给定某些事件,例如人们坐在一起 table,我想将这些总结为成对出现的频率。也就是说,两个元素出现的频率是多少consecutively/adjoined?转折点是 A B
和 B 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
我尝试了多种 summarization/aggregation 策略,但都失败了。
结局是什么?我想创建一个使用 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
或作为邻接矩阵。
你可以用 dplyr
做到这一点。我不得不改变你的功能来禁止因素。然后,我使用 pmin
和 pmax
以及 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