根据具有多个复杂条件的第一个表计算和填充第二个表的值

时间:2017-10-04 13:38:52

标签: r

在R中,我有这个主要的Order表:

enter image description here

我必须构建第二个包含步骤的表。第一个订单有3个步骤,第二个订单有4个步骤。我正在寻找如何填充输入和输出数量字段的方法:

enter image description here

第一个订单'Product1_Slit_Product2'的InputQuantity应该是其第一个OrderStep'Product1_Slit_Product2_1'的InputQuantity。

第一个订单'Product1_Slit_Product2'的OutputQuantity应该是 最后一个OrderStep'Product1_Slit_Product2_3的输出量。

像这样:

enter image description here

空字段需要填充InputQuantity和OutputQuantity之间的任何值,但逐渐减少..例如:

enter image description here

请帮我在R中构建第二个表,根据第一个表填充Input和OutputQuantity。任何指针/提示都会对这位初学者有所帮助。提前谢谢。

1 个答案:

答案 0 :(得分:2)

我们可以使用dplyrtidyrimputeTS个套餐中的功能。

首先,让我们创建一个类似于您的示例的数据框。

# 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是最终输出。