在R中,我有这个主要的Order表:
我必须构建第二个包含步骤的表。第一个订单有3个步骤,第二个订单有4个步骤。我正在寻找如何填充输入和输出数量字段的方法:
第一个订单'Product1_Slit_Product2'的InputQuantity应该是其第一个OrderStep'Product1_Slit_Product2_1'的InputQuantity。
第一个订单'Product1_Slit_Product2'的OutputQuantity应该是 最后一个OrderStep'Product1_Slit_Product2_3的输出量。
像这样:
空字段需要填充InputQuantity和OutputQuantity之间的任何值,但逐渐减少..例如:
请帮我在R中构建第二个表,根据第一个表填充Input和OutputQuantity。任何指针/提示都会对这位初学者有所帮助。提前谢谢。
答案 0 :(得分:2)
我们可以使用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
是最终输出。