これは醜いが機能的な解決策です。奇妙で複雑なサブセット化で申し訳ありませんが、残念ながら by() は非常に奇妙な方法でデータを保存します。
mysamp <- function(dat){
samp <- runif(length(dat)) #get 12 random numbers
samp <- ceiling(samp*12) #standardize between 1 and 12
return(samp)
}
これは、母集団を 12 のサンプルに分割するために使用する関数です。ここで、「zz」がデータセットであるとします。
cust <- c(101, 101, 102, 105, 107)
prod <- c(4004, 2000, 3000, 3000, 4004)
life <- c('A', 'B', 'B', 'B', 'A')
zz <- data.frame(cust, prod, life)
prodlife <- paste0(zz$prod, zz$life)
zz <- data.frame(zz, prodlife)
あなたに与える
> zz
cust prod life prodlife
1 101 4004 A 4004A
2 101 2000 B 2000B
3 102 3000 B 3000B
4 105 3000 B 3000B
5 107 4004 A 4004A
次に、cycle.id を入れるために 0 の列を作成する必要があります (私の例では「cyc」と呼んでいます)。zz$prodlife を追加したときと同じように、それを data.frame に添付します。次に、これらのステートメントを使用してサンプリングし、サンプルを列に割り当てることができます。
cycle <- by(newzz$cust, newzz$prodlife, mysamp)
for(i in 1:length(cycle)){
for(j in 1: length(cycle[i][[1]])){
zz$cyc[zz$prodlife == names(cycle)[i]][j] <- cycle[i][[1]][j]
}
}
by() ステートメントはそこですべての作業を行っており、恐ろしい for ループはサンプリングされた値を正しい場所に割り当てているだけです。「by」クラスは不便にサブセット化されているため、この割り当てを行うためのより効率的な方法を思い付くことができませんでしたが、他の人ができるかもしれません...? いずれにせよ、これは私に与えました:
> zz
cust prod life prodlife cyc
1 101 4004 A 4004A 6
2 101 2000 B 2000B 5
3 102 3000 B 3000B 7
4 105 3000 B 3000B 8
5 107 4004 A 4004A 1
もちろん、この例はサンプルが正しく成層化されているかどうかを判断するには小さすぎますが、うまくいくはずです。ハッピーコーディング!