计算和填充值来基于与多个复合物的条件

计算和填充值来基于与多个复合物的条件

问题描述:

第一表第二表

在R,I具有该一次订单表:计算和填充值来基于与多个复合物的条件

enter image description here

我必须建立具有以下步骤此第二表为了。首先有3个步骤,而第二级有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

请根据第一个表格,帮助我在R中构建第二个表格,以便根据第一个表格填充Input和OutputQuantity。任何指针/提示将有助于这个初学者。提前致谢。

+1

请发表[可重现的例子](https://*.com/questions/5963269/how-to-make-a-great-r-reproducible-example) – PoGibas

我们可以使用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:// *。com/questions/24202120/dplyrselect-function-collision-with-massselect – www