2017-03-02 5 views
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']) 

} 

편집 : 추가 샘플 데이터

+0

: 게시 된 샘플 데이터로 테스트하기 위해 설정해야하는 샘플 씨, set.seed(###) 전에 모두 부품LineParts 할당 다시 실행 같은 임의의 숫자에 다량의 코드를 저장하십시오. 반복적 인 작업 대신'LinePartsTemp [c ("var1", "var2")] <- lapply (LinePartsTemp [c ("var1", "var2")], as.integer) 일부 단순화 된 데이터로 재현 가능한 예제를 제공하면 대답을 얻는 것이 훨씬 더 쉬울 것입니다. – thelatemail

+0

감사합니다. 샘플 데이터를 추가하고 lapply를 살펴 보겠습니다. –

답변

1

빈 용기를 초기화하고 나중에 많은, 별도의 환경 객체를 사용하여 그들에게 추가 피한다 목록과 상호 작용을 고려한다. 아래에는 입력 외에 두 개의 객체 만 사용됩니다.

  1. 첫째, stations_veclist을이어서 LineParts dataframes 목록, 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)) 
    ) 
    

    그리고 피하기 :

당신은 dataframe 목록의 lapply이 업데이트 된 값을 다시 할 필요가LineParts 이후 (로컬 기능의 범위를 외부) 전역 개체를 업데이트 할 <<- 연산자를 사용하여 알 수 있습니다 많은 vapply 호출을 모두 LineParts 데이터 프레임 항목을 하나의 큰 데이터 프레임, LinePartsAll (234 X 400에 대해 N = 93,600 obs)로 바인딩 한 다음 값 se 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'] 
) 

및 확인이 업데이트 훨씬 빠른 방법은 동일한 최종 값 repoduce 않는 원래 이중 for 루프 처리. ? 당신은이에 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