2016-11-26 7 views
1

大規模なデータフレームに含まれるトレーニングから一連のトレーニングを生成することで、Rでトレーニングスケジュールを作成したいと考えています(行はトレーニング、3列はトレーニング名、カテゴリ、期間などの機能が含まれています)。 'Category'はAからNまでの値をとり、各カテゴリには不等運動数があります。シーケンスは次のように生成されます: 1.シーケンスを開始するには、カテゴリA、次にB、C、Nの任意のエクササイズを描きます。 2.カテゴリAからNへの置換えなしで描画するたびに、(1)を繰り返してシーケンスを生成し続ける。 3.カテゴリ(例えばA)のすべてのワークアウトが描画されたら、そのカテゴリを「補充」して描画を開始する再度交換することなく。 4.すべてのトレーニングが少なくとも1回は使用されるまで続けます。 5.構築されたシーケンスを出力しますが、各トレーニング(リピートを含む)の元の情報(すべて3列すべて)を保持します。この非常に重要な問題とあなたの助けをRで層別ランダムシーケンスを生成する最良の方法は?

感謝:)

あなたのサンプルデータセットとご回答のため、ジム、ありがとうございました。これは、(簡単にするために、実際のカテゴリーよりも少ないと)良い代表偽のデータセットです。

set.seed(1) 
dat <- data.frame(workout = sample(1:200), category =  sample(c('A','B','C'),200,T)) 

head(dat) 
# workout category 
# 1  25  C 
# 2  14  C 
# 3  191  C 
# 4  88  C 
# 5  73  B 
# 6  34  B 

しかし、私は一日ごとに1つだけのワークアウトをしたいことを指定している必要がありますので、各出力行は、ワークアウト中の日表すことになりスケジュール。

head(dat) 
#Day workout category 
#1 8  A  
#2 73  B 
#3 88  C 
#4 4  A 
+0

今まで試みた電子 – ekstroem

答えて

1
dat <- data.frame(workout = sample(1:15), category = sample(c('A','B','C'),15,T)) 
dat 
# workout category 
#1  14  A 
#2  1  B 
#3  11  A 
#4  9  B 
#5  13  A 
#6  12  C 
#7  6  B 
#8  8  C 
#9  3  C 
#10  15  A 
#11  4  C 
#12  7  B 
#13  5  A 
#14  10  A 
#15  2  B 
cats <- list() 
cats[[1]] <- which(dat$category=='A') 
cats[[2]] <- which(dat$category=='B') 
cats[[3]] <- which(dat$category=='C') 
lens <- sapply(cats,length) 
m <- max(lens) 
days <- matrix(0,m,3) 
for(i in 1:3){ 
    if(lens[i]==m) days[,i] <- sample(cats[[i]]) 
    else days[,i] <- c(sample(cats[[i]]),sample(cats[[i]],m-lens[i])) 
} 

その後、適切に並べ替えデータセットが

dat[c(t(days)),] 
#  workout category 
#13   5  A 
#7   6  B 
#6   12  C 
#5   13  A 
#2   1  B 
#8   8  C 
#14  10  A 
#12   7  B 
#11   4  C 
#10  15  A 
#4   9  B 
#9   3  C 
#1   14  A 
#15   2  B 
#11.1  4  C 
#3   11  A 
#2.1  1  B 
#6.1  12  C 

編集は、次のとおりです:いくつかのカテゴリは他の人にいくつかの変更の2倍の数の倍以上発生した場合、出力は次のようになります望んで上記の関数を使用する必要があります。代わりに関数を使用する必要があります。

reorder <- function(dat){ 
    if(!('category' %in% names(dat))) return('No column named category') 
    categories <- sort(unique(dat$category)) 
    N <- length(categories) 
    fun <- function(cat) which(dat$category==cat) 
    cats <- lapply(categories,fun) 
    lens <- sapply(cats,length) 
    m <- max(lens) 
    days <- matrix(0, m, N) 
    for(i in 1:N){ 
     ratio <- m/lens[i] 
     out <- sample(cats[[i]]) 
     if(ratio > 1){ 
      if(ratio > 2) for(j in 2:floor(ratio)) out <- c(out, sample(cats[[i]])) 
      out <- c(out, sample(cats[[i]], m - length(out))) 
     } 
     days[,i] <- out 
    } 
    return(dat[c(t(days)),]) 
} 
+0

私はこれが完璧だと思う、ジム!どうもありがとうございました。 – KDA

+0

ジム、更新された機能をお寄せいただきありがとうございます。私は実際のデータセットで元のスクリプトを試しましたが、おそらくあなたが言及した理由で(おそらく2つの非常に大きなカテゴリ)問題を抱えていました。この機能は完全に機能します! – KDA

関連する問題