1

我想创建一个函数,它接受 1 到 10 个向量并返回是或否,这意味着我的所有向量都代表一个“完整设计”。

这是我称之为“完整设计”的示例:

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)

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

这是“不完整设计”的两个示例:(在以下两个示例中,a 和 b 匹配,但 c 不匹配 a 和 b)

示例 1:

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)

示例 2:

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)

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

非常感谢 !

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

4

2 回答 2

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它给出了可能的组合总数。

于 2013-03-02T14:33:22.323 回答
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))

一旦我们这样做了,我们可以split这样data.frame做:

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

然后,我们可以编写一个小函数来检查拆分的每个部分是否相等。我们会稍微作弊并使用merge,但必须有更强大的方法来做到这一点。这个想法是,如果我们merge在相同的输入上使用,它应该只是一个data.frame与所有输入相同的单个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"
于 2013-03-02T12:37:16.330 回答