计算和填充值来基于与多个复合物的条件
问题描述:
第一表第二表
在R,I具有该一次订单表:计算和填充值来基于与多个复合物的条件
我必须建立具有以下步骤此第二表为了。首先有3个步骤,而第二级有4 steps.And我想办法如何填充输入和输出数量字段:
第一的InputQuantity订单'Product1_Slit_Product2'应该是其第一个OrderStep'Product1_Slit_Product2_1'的InputQuantity。
第一个订单'Product1_Slit_Product2'的OutputQuantity应该是其上一个OrderStep'Product1_Slit_Product2_3的 OutputQuantity。
像这样:
和空字段需要与位于InputQuantity和OutputQuantity之间的任意值来填充,但逐渐减少。例如像这样:
请根据第一个表格,帮助我在R中构建第二个表格,以便根据第一个表格填充Input和OutputQuantity。任何指针/提示将有助于这个初学者。提前致谢。
答
我们可以使用dplyr
,tidyr
和imputeTS
包中的函数。
首先,让我们创建一个类似于您的示例的数据框。
# 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
最后,合并dt2
和dt3
,然后填写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
是最终的输出。
请发表[可重现的例子](https://stackoverflow.com/questions/5963269/how-to-make-a-great-r-reproducible-example) – PoGibas