2017-10-04 1 views
0
가진 첫번째 테이블을 기반으로 두 번째 테이블에 값을 채우는

R에서,이 차 주문 테이블이 있습니다계산 및 여러 복잡한 조건

enter image description here

을 그리고 나는 단계가 두 번째 테이블을 구축해야 좁은 방 순서는 3 개 단계를 가지고 있으며, 2 차 내가 어떻게 입력 및 출력 수량 필드를 채울 수있는 방법을 찾고 있어요 4 steps.And 있습니다

enter image description here

최초의 InputQuantity을 'Product1_Slit_Product2'주문은 첫 번째 OrderStep 'Product1_Slit_Product2_1'의 InputQuantity 여야합니다.

첫 번째 주문 'Product1_Slit_Product2'의 OutputQuantity는 마지막 OrderStep 'Product1_Slit_Product2_3'의 OutputQuantity 여야합니다. 이와 같이

:

enter image description here

그리고 비어있는 필드는 다음과 같이, 예를 들면 있습니다 .. InputQuantity OutputQuantity 및 사이에있는 임의의 값으로 채워지지만 점차 감소 할 필요

enter image description here

첫 번째 테이블에 따라 Input 및 OutputQuantity를 채우는 것과 관련하여이 두 번째 테이블을 R로 작성하는 데 도움을주십시오. 모든 포인터/팁은이 초보자를 도울 것입니다. 미리 감사드립니다.

+1

[재현 가능한 예] (https://stackoverflow.com/questions/5963269/how-to-make-a-great-r-reproducible-example)를 게시하십시오 – PoGibas

답변

2

dplyr, tidyrimputeTS 패키지의 기능을 사용할 수 있습니다.

먼저, 예제와 비슷한 데이터 프레임을 만듭니다.

# Create example data frame 
dt <- data_frame(Order = c(rep(1, 3), rep(2, 4)), 
       OrderSteps = c(1:3, 1:4), 
       InputQuantity = c(300.56, NA, NA, 65.89, NA, NA, NA), 
       OutputQuantity = c(NA, NA, 243.65, NA, NA, NA, 12.54)) 

dt 
# A tibble: 7 x 4 
    Order OrderSteps InputQuantity OutputQuantity 
    <dbl>  <int>   <dbl>   <dbl> 
1  1   1  300.56    NA 
2  1   2   NA    NA 
3  1   3   NA   243.65 
4  2   1   65.89    NA 
5  2   2   NA    NA 
6  2   3   NA    NA 
7  2   4   NA   12.54 

둘째

dt2 <- dt %>% 
    gather(Type, Value, InputQuantity:OutputQuantity) %>% 
    arrange(Order, OrderSteps) 

dt2 
# A tibble: 14 x 4 
    Order OrderSteps   Type Value 
    <dbl>  <int>   <chr> <dbl> 
1  1   1 InputQuantity 300.56 
2  1   1 OutputQuantity  NA 
3  1   2 InputQuantity  NA 
4  1   2 OutputQuantity  NA 
5  1   3 InputQuantity  NA 
6  1   3 OutputQuantity 243.65 
7  2   1 InputQuantity 65.89 
8  2   1 OutputQuantity  NA 
9  2   2 InputQuantity  NA 
10  2   2 OutputQuantity  NA 
11  2   3 InputQuantity  NA 
12  2   3 OutputQuantity  NA 
13  2   4 InputQuantity  NA 
14  2   4 OutputQuantity 12.54 

셋째 긴 포맷 다양한 형식의 데이터 프레임을 변환 한 데이터 프레임을 필터링하고 NA을 돌리다.

dt3 <- dt2 %>% 
    filter(Type %in% "OutputQuantity" | !is.na(Value)) %>% 
    mutate(Value = na.interpolation(Value)) 

dt3 
# A tibble: 9 x 4 
    Order OrderSteps   Type Value 
    <dbl>  <int>   <chr> <dbl> 
1  1   1 InputQuantity 300.5600 
2  1   1 OutputQuantity 281.5900 
3  1   2 OutputQuantity 262.6200 
4  1   3 OutputQuantity 243.6500 
5  2   1 InputQuantity 65.8900 
6  2   1 OutputQuantity 52.5525 
7  2   2 OutputQuantity 39.2150 
8  2   3 OutputQuantity 25.8775 
9  2   4 OutputQuantity 12.5400 

마지막으로, dt2dt3을 병합 한 다음 이전 레코드로 NA를 입력합니다. 그런 다음 데이터 프레임을 다시 와이드 형식으로 변환하십시오.

dt4 <- dt2 %>% 
    left_join(dt3, by = c("Order", "OrderSteps", "Type")) %>% 
    fill(Value.y) %>% 
    select(-Value.x) %>% 
    spread(Type, Value.y) 
dt4 
# A tibble: 7 x 4 
    Order OrderSteps InputQuantity OutputQuantity 
* <dbl>  <int>   <dbl>   <dbl> 
1  1   1  300.5600  281.5900 
2  1   2  281.5900  262.6200 
3  1   3  262.6200  243.6500 
4  2   1  65.8900  52.5525 
5  2   2  52.5525  39.2150 
6  2   3  39.2150  25.8775 
7  2   4  25.8775  12.5400 

dt4이 최종 출력입니다.

+0

자세한 답변을 주셔서 감사합니다 ycw! 나는 이것을 밖으로 시험 할 것이다. – Pree

+0

마지막 dt4 단계를 실행하면이 오류가 발생합니다. select (., -Value.x) 오류 : 사용하지 않은 인수 (-Value.x). 나는 여러 가지 아이디어를 시도했지만이 마지막 단계에서 못을 박는 것은 아닙니다. 여기서 무엇이 잘못되었는지 지적 해 주시겠습니까? 감사. – Pree

+0

@Pree 다른 패키지가 아닌'dplyr'의'select' 함수를 사용하고 있는지 확인하십시오. 도움이 될 수 있습니다 : https : // stackoverflow.com/questions/24202120/dplyrselect-function-clashes-with-massselect – www