2013-03-02 80 views
1

我想创建一个从1到10个向量并返回Yes或No的函数,这意味着我的所有向量都代表“完整设计”。R:检查完整设计的函数

这里是我称之为一个 “完整的设计” 的一个例子:

一个< - (1,1,1,1,2,2,2,2,3,3 C, 3,3)

b < - C(1,2,1,2,1,2,1,2,1,2,1,2)

ç< - C(1,1, 2,2,1,1,2,2,1,1,2,2)

它是一个完整的设计,因为: 对于所有矢量的所有等级,(在相同位置)所有其他矢量的所有等级都有相同的次数。

这里是 “不完整的设计” 2点的例子: (在两个下面的实施例A和B的比赛,但C没有用b匹配既不)

例1:

一个< - c(1,1,1,1,2,2,2,2,3,3,3,3)

b < -c(1,2,1,2,1,2,1, 2,1,2,1,2)

c < -c(1,2,3,1,2,3,1,2,3 ,1,2,3)

例2:

一个< - C(1,1,1,1,2,2,2,2,3,3,3,3 )

b < - C(1,2,1,2,1,2,1,2,1,2,1,2)

ç< - C(1,2,3,4 ,5,1,2,3,4,5,1,2)

希望我很清楚。整个想法是,我有一个数据集,这个数据集是由因素a,b,c,d,e等解释的......我想要一个函数告诉我,我正在测试一个完整的还是一个在运行aov()之前不完整的设计。

非常感谢!

在我想创建的函数中询问的问题如下所示: 当等于给定等级时(例如,假设为2)。我们看b [which(a == 2)]并检查b的所有等级是否包含在b [which(a == 2)]中,并检查b [which(a == 2)]的所有等级重复相同的次数。

+0

对不起,但是'a,b和c'中的levels(factor(a))== c(1,2,3)'是怎么样的? “a”和“b”匹配是什么意思,但是“a”或“b”不匹配?什么是匹配? – Arun 2013-03-02 11:31:33

+0

当然,所有的矢量(在我的例子中,a,b,c)没有相同的层数。我只写了一个向量级别的例子。但我现在删除了它。 当我说a和b匹配时,我的意思是如果你删除向量c a和b来做一个完整的设计。这意味着只有对于c的每个等级,其他向量的等级的数目不相等。 在不完整设计的示例1中: c具有3个等级1,2和3.对于c的等级5,只有等级2和3的矢量。因为它在矢量c中缺少一个位于矢量c中的5的矢量a中的1。 – 2013-03-02 11:49:56

+0

现在有点可以理解了吗?! – 2013-03-02 11:54:04

回答

2

如果我理解正确,那么您可能会以某种方式使用interaction作为决定数据是否完整的首选。看看你的例子,看起来应该总是有一个唯一的组合(不是2,而不是0)在每个向量中的所有独特的级别。因此,对于首套告诉你:

> all(table(interaction(a, b, c)) == 1) 
[1] TRUE 

而且,对于其他两个例子,如果你做同样的,你会得到FALSE作为结果。


另一种选择是假设,我们可以把变量a为分组变量,并把所有的向量为data.frame这样的:

df1 <- data.frame(a = c(1,1,1,1,2,2,2,2,3,3,3,3), 
        b = c(1,2,1,2,1,2,1,2,1,2,1,2), 
        c = c(1,1,2,2,1,1,2,2,1,1,2,2)) 

一旦我们做到了,我们可以splitdata.frame如下:

DF1 <- split(df1[-1], df1[1]) 

然后,我们可以写一个小功能,以检查看到,每个部O f分裂是平等的。我们会欺骗一点点并使用merge,但必须有更强大的方法才能做到这一点。这个想法是,如果我们在相同的输入上使用merge,那么它应该最终产生一个与所有输入data.frames相同的data.frame

这里是一个(不是很强大 - 没有广泛测试)的功能,可以作为一个起点。

myFun <- function(myList) { 
    all.equal(Reduce(function(x, y) 
    merge(x, y, all = TRUE, sort = FALSE), myList), 
      myList[[1]], check.attributes = FALSE) 
} 

应用于DF1,它给我们TRUE,但请尝试以下操作:

df2 <- data.frame(a = c(1,1,1,1,2,2,2,2,3,3,3,3), 
        b = c(1,2,1,2,1,2,1,2,1,2,1,2), 
        c = c(1,2,3,1,2,3,1,2,3,1,2,3)) 
df3 <- data.frame(a = c(1,1,1,1,2,2,2,2,3,3,3,3), 
        b = c(1,2,1,2,1,2,1,2,1,2,1,2), 
        c = c(1,2,3,4,5,1,2,3,4,5,1,2)) 

DF1 <- split(df1[-1], df1[1]) 
DF2 <- split(df2[-1], df2[1]) 
DF3 <- split(df3[-1], df3[1]) 

myFun(DF1) 
# [1] TRUE 
myFun(DF2) 
# [1] "Component 1: Numeric: lengths (6, 4) differ" "Component 2: Numeric: lengths (6, 4) differ" 
myFun(DF3) 
# [1] "Component 1: Numeric: lengths (10, 4) differ" "Component 2: Numeric: lengths (10, 4) differ" 
4

有一个很简单的方法来做到这一点使用plyr的id()功能:

library(plyr) 
a <- c(1,1,1,1,2,2,2,2,3,3,3,3) 
b <- c(1,2,1,2,1,2,1,2,1,2,1,2) 
c <- c(1,1,2,2,1,1,2,2,1,1,2,2) 

ids <- id(data.frame(a, b, c)) 
attr(ids, "n") == length(unique(ids)) 
# [1] TRUE 

d <- c(1,1,2,2,1,1,2,2,1,1,2,3) 
ids <- id(data.frame(a, b, d)) 
attr(ids, "n") == length(unique(ids)) 
# [1] FALSE 

id()作品通过为输入中的每一行分配一个唯一的ID,以这种方式为所有可能的组合提供空间。输出包含一个属性,n,它给出了可能的组合总数。

+0

+1。直到现在还不知道plyr中的'id()'函数。 – A5C1D2H2I1M1N2O1R2T1 2013-03-02 15:44:27