使用R

时间:2015-07-07 12:54:29

标签: r time-series permutation combinatorics

想象一下时间序列实验,其中3个时间点(ABC)中的每一个都被复制3次:

A1, A2, A3, B1, B2, B3, C1, C2, C3

我们希望在所有可能的排列中连接数据(生成3个循环的时间序列:ABC,ABC,ABC)(每次使用不同的时间点重复)。这里举例说明一些:

A1, B1, C1,  A1, B1, C2, A1, B1, C3
A1, B2, C1,  A1, B2, C2, A1, B2, C3
A1, B3, C1,  A1, B3, C2, A1, B3, C3

有人可以建议使用R脚本来执行此任务吗?提前谢谢,伊兰

1 个答案:

答案 0 :(得分:0)

使用展开网格:

expand.grid(A = c("A1","A2","A3"), B = c("B1","B2","B3"), C = c("C1","C2","C3"))

返回

    A  B  C
1  A1 B1 C1
2  A2 B1 C1
3  A3 B1 C1
...
23 A2 B2 C3
24 A3 B2 C3
25 A1 B3 C3
26 A2 B3 C3
27 A3 B3 C3

编辑:根据以下评论,这个问题有一个更微妙的诀窍。

我相当确定有一种更有效的方法可以做到这一点,但我似乎无法想到一种方法,而不仅仅是测试所有排列:

library(gtools)
library(data.table)

dt <- data.table(expand.grid(A = c(1,2,3), B = c(1,2,3), C = c(1,2,3)))

perm <- data.frame(permutations(nrow(dt),3,1:nrow(dt)))

perm是一个包含所有可能的行排列的数据框。

我们现在可以创建一个列表,每个元素都是一个组合:

mylist <- apply(perm,1,function(x,y){y[as.numeric(x)]},dt)

然后我们可以测试哪些列表元素每列都有三个唯一值

mylist[as.logical(lapply(mylist,function(x){all(lapply(x,function(y){length(unique(y))}) == 3)}))]

这是一个公式的遗嘱,但它完成了这项工作。它返回满足上述条件的3x3数据帧列表。

编辑2: nvm,更简单:

library(data.table)
library(gtools)

dt <- data.table(permutations(n = 3, r = 3, v = 1:3))
perm <- data.frame(permutations(nrow(dt),3,1:nrow(dt), repeats.allowed = T))
mylist <- apply(perm,1,function(x,y){y[as.numeric(x)]},dt)

mylist <- lapply(mylist,t)
mylist <- lapply(mylist,`colnames<-`,c("A","B","C"))