【发布时间】:2012-12-13 11:58:26
【问题描述】:
我有一个传递流量数据,显示成员之间的传递流量,here's the sample dataset
它以连续的行显示成员之间的交互。我想计算这些交互,并获得一个新数据集,该数据集显示每个成员之间发生了多少次交互,方向无关紧要
例如:
between 26 and 11 = X
between 26 and 27 = Y
我只是想不通我可以使用哪个函数以及如何为这个计算编写代码。谢谢
【问题讨论】:
我有一个传递流量数据,显示成员之间的传递流量,here's the sample dataset
它以连续的行显示成员之间的交互。我想计算这些交互,并获得一个新数据集,该数据集显示每个成员之间发生了多少次交互,方向无关紧要
例如:
between 26 and 11 = X
between 26 and 27 = Y
我只是想不通我可以使用哪个函数以及如何为这个计算编写代码。谢谢
【问题讨论】:
您可以使用 zoo 包中的 rollaply 函数来查找所有交互。可以使用table 计算这些交互的频率。 (我假设您的对象称为dat。)
library(zoo)
table(as.data.frame(rollapply(dat[[1]], 2, sort)))
结果:
V2
V1 4 8 10 11 13 17 19 25 26 27 53
4 2 13 17 1 2 5 6 3 1 9 4
8 0 2 14 11 10 4 5 0 13 13 11
10 0 0 3 9 7 2 4 2 8 11 8
11 0 0 0 1 6 5 4 4 5 4 25
13 0 0 0 0 0 1 3 5 7 9 8
17 0 0 0 0 0 0 1 1 1 5 5
19 0 0 0 0 0 0 1 1 1 5 4
25 0 0 0 0 0 0 0 0 5 8 5
26 0 0 0 0 0 0 0 0 1 5 3
27 0 0 0 0 0 0 0 0 0 0 1
53 0 0 0 0 0 0 0 0 0 0 1
矩阵的下三角部分仅包含零,因为方向无关紧要。
如果您对相同值之间的交互不感兴趣,请使用以下命令:
table(as.data.frame(rollapply(rle(dat[[1]])$values, 2, sort)))
V2
V1 8 10 11 13 17 19 25 26 27 53
4 13 17 1 2 5 6 3 1 9 4
8 0 14 11 10 4 5 0 13 13 11
10 0 0 9 7 2 4 2 8 11 8
11 0 0 0 6 5 4 4 5 4 25
13 0 0 0 0 1 3 5 7 9 8
17 0 0 0 0 0 1 1 1 5 5
19 0 0 0 0 0 0 1 1 5 4
25 0 0 0 0 0 0 0 5 8 5
26 0 0 0 0 0 0 0 0 5 3
27 0 0 0 0 0 0 0 0 0 1
【讨论】:
table(as.data.frame(rollapply(rle(dat[[1]])$values, 2, sort))[c(2,1)]) 或将函数 t 与现有矩阵一起使用