1

1 ~ 10 個のベクトルを取り、Yes または No を返す関数を作成したいと考えています。これは、すべてのベクトルが「完全なデザイン」を表していることを意味します。

以下は、私が「完全な設計」と呼ぶものの例です。

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)

すべてのベクトルのすべてのレベルに対して、他のすべてのベクトルのすべてのレベルが同じ回数 (同じ位置に) 存在します。

「不完全なデザイン」の 2 つの例を次に示します。

例 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私が正しく理解していれば、データが完全であるかどうかを判断するための最初の手段として何らかの方法で使用できる可能性があります。

あなたの例を見ると、各ベクトル内のすべての一意のレベルの1つの一意の組み合わせ(2ではなく0ではない)が常に存在する必要があるようです。したがって、最初のセットでは、次のように表示します。

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

そして、他の2つの例では、同じことを行うとFALSE、結果として得られます。


aもう1つのオプションは、変数をグループ化変数として扱うことができると想定し、すべてのベクトルを次の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.framedata.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 に答える