2013-03-02 81 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