2017-03-02 11 views
1

アセンブリラインをシミュレートしようとしています。私は部品のリストと各ステーションでどれくらいの時間を費やしているのですか?私は一度に1つずつ組立ラインを通ってパーツを送り、各ステーションで時間を記録しようとしています。しかし、私がこの作業をする方法は、forループをforループの中に入れ子にすることです。これを行うにはよりよい方法が必要です。forループによるベクトル化のベクトル化

parts <- data.frame(JobNum = sample(c('a','b','c','d'),400,replace=TRUE) 
,DS.CT = sample.int(10,400,replace=TRUE) 
,C1.CT = sample.int(10,400,replace=TRUE) 
,C2.CT = sample.int(10,400,replace=TRUE) 
,C3.CT = sample.int(10,400,replace=TRUE) 
,C4.CT = sample.int(10,400,replace=TRUE) 
,C5D5.CT = sample.int(10,400,replace=TRUE) 
,C6D6.CT = sample.int(10,400,replace=TRUE) 
,C5D7.CT = sample.int(10,400,replace=TRUE) 
,C6D8.CT = sample.int(10,400,replace=TRUE) 
,C7CD.CT = sample.int(10,400,replace=TRUE) 
) 

LineParts <- parts[sample(nrow(parts),234,replace=FALSE),] 

#Initialize Dip collecting variables 
DS <- c() 
D1 <- c() 
D2 <- c() 
D3 <- c() 
D4 <- c() 
D5 <- c() 
D6 <- c() 
D7 <- c() 
D8 <- c() 
D9 <- c() 

for(i in 1:dim(parts)[1]){ 

#Create temporary dataframe for use in indexing line 
LinePartsTemp <- data.frame(matrix("",nrow=234,ncol=11)) 
colnames(LinePartsTemp)=names(LineParts) 
LinePartsTemp$JobNum <- as.character(LinePartsTemp$JobNum) 
LinePartsTemp$DS.CT <- as.integer(LinePartsTemp$DS.CT) 
LinePartsTemp$C1.CT <- as.integer(LinePartsTemp$C1.CT) 
LinePartsTemp$C2.CT <- as.integer(LinePartsTemp$C2.CT) 
LinePartsTemp$C3.CT <- as.integer(LinePartsTemp$C3.CT) 
LinePartsTemp$C4.CT <- as.integer(LinePartsTemp$C4.CT) 
LinePartsTemp$C5D5.CT <- as.integer(LinePartsTemp$C5D5.CT) 
LinePartsTemp$C6D6.CT <- as.integer(LinePartsTemp$C6D6.CT) 
LinePartsTemp$C5D7.CT <- as.integer(LinePartsTemp$C5D7.CT) 
LinePartsTemp$C6D8.CT <- as.integer(LinePartsTemp$C6D8.CT) 
LinePartsTemp$C7CD.CT <- as.integer(LinePartsTemp$C7CD.CT) 

#Index line 
for(j in 1:dim(LineParts)[1]){ 
    LinePartsTemp[j+1,] <- LineParts[j,] 
} 

#put new part into system 
LinePartsTemp[1,] <- parts[i,] 

#update the list of parts on the line 
LineParts <- LinePartsTemp 

#Append CT values at stations 
DS <- append(DS,LineParts[1,'DS.CT']) 
D1 <- append(D1,LineParts[10,'C1.CT']) 
D2 <- append(D2,LineParts[26,'C2.CT']) 
D3 <- append(D3,LineParts[42,'C3.CT']) 
D4 <- append(D4,LineParts[57,'C4.CT']) 
D5 <- append(D5,LineParts[85,'C5D5.CT']) 
D6 <- append(D6,LineParts[120,'C6D6.CT']) 
D7 <- append(D7,LineParts[167,'C5D7.CT']) 
D8 <- append(D8,LineParts[210,'C6D8.CT']) 
D9 <- append(D9,LineParts[234,'C7CD.CT']) 

} 

EDIT:追加サンプルデータ

+0

:ポストされたサンプルデータでテストするには、サンプル種、set.seed(###)、前部品LineParts同じ乱数を再実行する割り当ての両方に設定する必要がありますあなたのコードの束を保存します。繰り返しタスクの代わりに 'LinePartsTemp [c(" var1 "、" var2 ")] < - lapply(LinePartsTemp [c(" var1 "、" var2 ")]、as.integer)いくつかの単純化されたデータで再現可能な例を提供すれば、答えを得る可能性がさらに高まります。 – thelatemail

+0

ありがとう、私はいくつかのサンプルデータを追加し、lapplyを調べます。 –

答えて

1

空の容器を初期化し、以降、多数の、別々の環境オブジェクトを使用して、それらに付加することを回避するリストとの相互作用を検討してください。以下では、入力に加えて2つのオブジェクトのみが使用されています。

  1. まず、ベクトル、stations_veclistのリストに必要なデータポイントを抽出し、その後LinePartsデータフレーム、LineParts_dfList
  2. のリストを作成します。

    LineParts_dfList <- lapply(seq(nrow(parts)), function(i){  
        #Index line 
        LinePartsTemp <- parts[1,] 
        LinePartsTemp[2:nrow(LineParts),] <- LineParts[1:nrow(LineParts)-1,] 
    
        #put new part into system 
        LinePartsTemp[1,] <- parts[i,] 
    
        #update the list of parts on the line 
        LineParts <<- LinePartsTemp  
    }) 
    
    # Extract CT values at stations 
    stations_veclist <- 
        list(
        DS = vapply(LineParts_dfList, function(df) df[1,'DS.CT'], numeric(1)), 
        D1 = vapply(LineParts_dfList, function(df) df[10,'C1.CT'], numeric(1)), 
        D2 = vapply(LineParts_dfList, function(df) df[26,'C2.CT'], numeric(1)), 
        D3 = vapply(LineParts_dfList, function(df) df[42,'C3.CT'], numeric(1)), 
        D4 = vapply(LineParts_dfList, function(df) df[57,'C4.CT'], numeric(1)), 
        D5 = vapply(LineParts_dfList, function(df) df[85,'C5D5.CT'], numeric(1)), 
        D6 = vapply(LineParts_dfList, function(df) df[120,'C6D6.CT'], numeric(1)), 
        D7 = vapply(LineParts_dfList, function(df) df[167,'C5D7.CT'], numeric(1)), 
        D8 = vapply(LineParts_dfList, function(df) df[210,'C6D8.CT'], numeric(1)), 
        D9 = vapply(LineParts_dfList, function(df) df[234,'C7CD.CT'], numeric(1)) 
    ) 
    

    そして回避するために:

あなたは、データフレームのリストのlapplyが更新された値を再利用する必要がLinePartsので、(ローカル関数の範囲外)グローバルオブジェクトを更新するために<<-演算子を使用してわかります多くのvapplyコールは、すべてLinePartsデータフレーム項目を1つの大きなデータフレームにバインドすることを検討してください。LinePartsAll(234 X 400ではN = 93,600 obs) quentially行で:

LinePartsAll <- do.call(rbind, LineParts_dfList) 

otherstations_veclist <- 
    list(
    DS = LinePartsAll[seq(1,93600, by=234),'DS.CT'], 
    D1 = LinePartsAll[seq(10,93600, by=234),'C1.CT'], 
    D2 = LinePartsAll[seq(26,93600, by=234),'C2.CT'], 
    D3 = LinePartsAll[seq(42,93600, by=234),'C3.CT'], 
    D4 = LinePartsAll[seq(57,93600, by=234),'C4.CT'], 
    D5 = LinePartsAll[seq(85,93600, by=234), 'C5D5.CT'], 
    D6 = LinePartsAll[seq(120,93600, by=234), 'C6D6.CT'], 
    D7 = LinePartsAll[seq(167,93600, by=234),'C5D7.CT'], 
    D8 = LinePartsAll[seq(210,93600, by=234), 'C6D8.CT'], 
    D9 = LinePartsAll[seq(234,93600, by=234), 'C7CD.CT'] 
) 

し、チェックする、これは、更新、はるかに高速方法は、元の二重のforループ処理と同じ終了値をrepoduceありません。 ?あなたはlapply`に `を通読している必要があり

all.equal(DS, stationsList$DS) 
# [1] TRUE 
all.equal(D1, stationsList$D1) 
# [1] TRUE 
all.equal(D9, stationsList$D9) 
# [1] TRUE 

all.equal(stations_veclist, otherstations_veclist) 
# [1] TRUE