数学行为的序列除以R中的群

问题描述 投票:0回答:1

我有数据。这里的例子

 mydat=structure(list(ItemRelation = c(11628L, 11628L, 11628L, 11628L, 
11628L, 11628L, 11628L, 11628L, 11628L, 11628L, 11628L, 11628L, 
11628L, 11628L, 11628L, 11628L, 11628L, 11628L, 11628L, 11628L, 
11628L, 11628L, 11628L, 11628L, 11628L, 11628L, 11628L, 11628L, 
11628L, 11628L, 11628L, 11628L, 11628L, 11628L, 11628L, 11628L, 
11628L, 11628L, 11628L, 11628L, 11628L, 11628L, 11628L, 11628L, 
11628L, 11628L, 11628L, 11628L, 11628L, 11628L, 11628L, 11628L, 
11628L, 11628L, 11628L, 11628L, 11628L, 11628L, 11628L, 11628L, 
11628L, 11628L, 11628L, 11628L, 11628L, 11628L, 11627L, 11627L, 
11627L, 11627L, 11627L, 11627L, 11627L, 11627L, 11627L, 11627L, 
11627L, 11627L, 11627L, 11627L, 11627L, 11627L, 11627L, 11627L, 
11627L, 11627L, 11627L, 11627L, 11627L, 11627L, 11627L, 11627L, 
11627L, 11627L, 11627L, 11627L, 11627L, 11627L, 11627L, 11627L, 
11627L, 11627L, 11627L, 11627L, 11627L, 11627L, 11627L, 11627L, 
11627L, 11627L, 11627L, 11627L, 11627L, 11627L, 11627L, 11627L, 
11627L, 11627L, 11627L, 11627L, 11627L, 11627L, 11627L, 11627L, 
11627L, 11627L, 11627L, 11627L, 11627L, 11627L, 11627L, 11627L
), SaleCount = c(0L, 0L, 6L, 0L, 38L, -14L, 0L, 0L, 0L, 0L, 0L, 
0L, 0L, 33L, 0L, -10L, -2L, 0L, 22L, -4L, 0L, 0L, -5L, 3L, 0L, 
28L, -14L, 0L, 0L, 0L, 0L, 0L, 21L, -5L, 0L, 0L, 0L, 0L, 0L, 
32L, -8L, 6L, 0L, 0L, 0L, 0L, 33L, -7L, 0L, 0L, 0L, 3L, -3L, 
47L, -22L, 0L, 0L, 0L, 0L, 0L, 26L, -3L, 0L, 0L, 0L, 6L, 0L, 
0L, 6L, 0L, 38L, -14L, 0L, 0L, 0L, 0L, 0L, 0L, 0L, 33L, 0L, -10L, 
-2L, 0L, 22L, -4L, 0L, 0L, -5L, 3L, 0L, 28L, -14L, 0L, 0L, 0L, 
0L, 0L, 21L, -5L, 0L, 0L, 0L, 0L, 0L, 32L, -8L, 6L, 0L, 0L, 0L, 
0L, 33L, -7L, 0L, 0L, 0L, 3L, -3L, 47L, -22L, 0L, 0L, 0L, 0L, 
0L, 26L, -3L, 0L, 0L, 0L, 6L), DocumentNum = c(3270L, 3270L, 
3270L, 3270L, 3270L, 3270L, 3270L, 3270L, 3270L, 3270L, 3270L, 
3270L, 3270L, 3270L, 3270L, 3270L, 3270L, 3270L, 3270L, 3270L, 
3270L, 3270L, 3270L, 3270L, 3270L, 3270L, 3270L, 3270L, 3270L, 
3270L, 3270L, 3270L, 3270L, 3270L, 3270L, 3270L, 3270L, 3270L, 
3270L, 3270L, 3270L, 3270L, 3270L, 3270L, 3270L, 3270L, 3270L, 
3270L, 3270L, 3270L, 3270L, 3270L, 3270L, 3270L, 3270L, 3270L, 
3270L, 3270L, 3270L, 3270L, 3270L, 3270L, 3270L, 3270L, 3270L, 
3270L, 3271L, 3271L, 3271L, 3271L, 3271L, 3271L, 3271L, 3271L, 
3271L, 3271L, 3271L, 3271L, 3271L, 3271L, 3271L, 3271L, 3271L, 
3271L, 3271L, 3271L, 3271L, 3271L, 3271L, 3271L, 3271L, 3271L, 
3271L, 3271L, 3271L, 3271L, 3271L, 3271L, 3271L, 3271L, 3271L, 
3271L, 3271L, 3271L, 3271L, 3271L, 3271L, 3271L, 3271L, 3271L, 
3271L, 3271L, 3271L, 3271L, 3271L, 3271L, 3271L, 3271L, 3271L, 
3271L, 3271L, 3271L, 3271L, 3271L, 3271L, 3271L, 3271L, 3271L, 
3271L, 3271L, 3271L, 3271L), IsPromo = c(0L, 0L, 0L, 0L, 0L, 
0L, 0L, 0L, 0L, 0L, 0L, 0L, 0L, 0L, 0L, 0L, 0L, 0L, 0L, 0L, 0L, 
0L, 0L, 0L, 0L, 0L, 0L, 0L, 0L, 0L, 0L, 0L, 0L, 0L, 0L, 1L, 1L, 
1L, 1L, 1L, 1L, 1L, 1L, 1L, 1L, 1L, 1L, 1L, 1L, 1L, 1L, 1L, 1L, 
1L, 1L, 1L, 1L, 1L, 1L, 1L, 1L, 1L, 1L, 0L, 0L, 0L, 0L, 0L, 0L, 
0L, 0L, 0L, 0L, 0L, 0L, 0L, 0L, 0L, 0L, 0L, 0L, 0L, 0L, 0L, 0L, 
0L, 0L, 0L, 0L, 0L, 0L, 0L, 0L, 0L, 0L, 0L, 0L, 0L, 0L, 0L, 0L, 
1L, 1L, 1L, 1L, 1L, 1L, 1L, 1L, 1L, 1L, 1L, 1L, 1L, 1L, 1L, 1L, 
1L, 1L, 1L, 1L, 1L, 1L, 1L, 1L, 1L, 1L, 1L, 1L, 0L, 0L, 0L)), .Names = c("ItemRelation", 
"SaleCount", "DocumentNum", "IsPromo"), class = "data.frame", row.names = c(NA, 
-132L))

数据包含两个按ItemRelation + DocumentNum列分组的组。

11628   3270
11627   3271

有Ispromo专栏。它只需要两个值0或1.所以我需要SaleCount的零类Ispromo得到非负值或零值的总和。 Only正值之和。在这种情况下

6 38 33 22 3 28 21 6

sum=157.

然后我需要得到only和负值

-14
-10
-2
-4
-5
-14
-5


sum=-54

然后我必须添加这两个值! 157+-54=103之后,我需要103除以正值的总数。这里只有8个正值。八分之一百○三= 12875。对于ispromo列的零类别。

For First category of Ispromo

通过salescount我需要获得所有值的总和以及正面和负面。

32
-8
6
33
-7
3
-3
47
-22
26
-3

sum=104

然后这个结果我需要除总计数正值。这是6

 32
6
33
3
47
26


104/6=17,33333333

最终的结果。从这个值qazxsw poi)我需要减去qazxsw poi的结果

(17,33333333

并将它乘以ispromo的第一类正值的计数在我们的例子中它是Zero category of ispromo when we 103 divided by the total number of positive values. 17,33333333-(12,875 * 6)= -59,91666667

必须对每个组进行这种数学运算

*103/8=12,875*

怎么做?正如预期的产出

6

或预期结果

11628   3270
11627   3271

edited with data specific

怎么做如果SaleCount的零类ispromo我只有零或负值,那么x4默认必须= 0。以及另一种变体:如果SaleCount的一类ispromo只有零或负值,则X6计算为X6 = 0-x4。这里的数据和cource可以同时是两个变体,就像在我的例子中一样。

  ItemRelation DocumentNum Ispromo_by_SaleCount_sum_of_not_negative_or_zero_value for_negative_value
1        11628        3270                                                    157                -54
2        11627        3271                                                    157                -54
  substract_positive_and_negative Ispromo_by_salescount_i_need_get_sum_all_values_and_positive_and_negative
1                             103                                                                       104
2                             103                                                                       104
  divide_on_total_count_positive_value._It_is_5 end_result
1                                        12.875      -59.9
2                                        12.875      -59.9

这里输出

    expect=sstructure(list(ItemRelation = c(11628L, 11627L), DocumentNum = 3270:3271, 
    Ispromo_by_SaleCount_sum_of_not_negative_or_zero_value = c(157L, 
    157L), for_negative_value = c(-54L, -54L), substract_positive_and_negative = c(103L, 
    103L), Ispromo_by_salescount_i_need_get_sum_all_values_and_positive_and_negative = c(104L, 
    104L), divide_on_total_count_positive_value._It_is_5 = c(12.875, 
    12.875), end_result = c(-59.9, -59.9)), .Names = c("ItemRelation", 
"DocumentNum", "Ispromo_by_SaleCount_sum_of_not_negative_or_zero_value", 
"for_negative_value", "substract_positive_and_negative", "Ispromo_by_salescount_i_need_get_sum_all_values_and_positive_and_negative", 
"divide_on_total_count_positive_value._It_is_5", "end_result"
), class = "data.frame", row.names = c(NA, -2L))
r dplyr data.table plyr
1个回答
2
投票
mydat=structure(list(ItemRelation = c(11709L, 11709L, 11709L, 11709L, 
11709L, 11709L, 11709L, 11709L, 11709L, 11709L, 11709L, 11709L, 
11709L, 11709L, 11709L, 11709L, 11709L, 11709L, 11709L, 11709L, 
11709L, 11709L, 11709L, 11709L, 11709L, 11709L, 11709L, 11709L, 
11709L, 11709L, 11709L, 11709L, 11709L, 11709L, 11709L, 11709L, 
11709L, 11709L, 11709L, 11709L, 11709L, 11709L, 11709L, 11709L, 
11709L, 11709L, 11709L, 11709L, 11709L, 11709L, 11709L, 11709L
), SaleCount = c(0L, 0L, -1L, 0L, 0L, 0L, -2L, 0L, 0L, -1L, 0L, 
0L, 0L, -1L, -1L, 0L, 0L, -1L, 0L, 0L, 0L, 0L, -1L, 0L, 0L, 0L, 
0L, 0L, 0L, -2L, 0L, 0L, 0L, 0L, 0L, 0L, 0L, 0L, -1L, 0L, 0L, 
0L, -1L, 0L, 0L, 0L, 1L, -2L, 0L, 0L, 0L, 0L), DocumentNum = c(1002L, 
1002L, 1002L, 1002L, 1002L, 1002L, 1002L, 1002L, 1002L, 1002L, 
1002L, 1002L, 1002L, 1002L, 1002L, 1002L, 1002L, 1002L, 1002L, 
1002L, 1002L, 1002L, 1002L, 1002L, 1002L, 1002L, 1002L, 1002L, 
1002L, 1002L, 1002L, 1002L, 1002L, 1002L, 1002L, 1002L, 1002L, 
1002L, 1002L, 1002L, 1002L, 1002L, 1002L, 1002L, 1002L, 1002L, 
1002L, 1002L, 1002L, 1002L, 1002L, 1002L), IsPromo = c(0L, 0L, 
0L, 0L, 0L, 0L, 0L, 0L, 0L, 0L, 0L, 0L, 0L, 0L, 0L, 0L, 0L, 0L, 
0L, 0L, 0L, 0L, 0L, 0L, 0L, 0L, 0L, 0L, 0L, 0L, 0L, 0L, 0L, 0L, 
0L, 1L, 1L, 1L, 1L, 1L, 1L, 1L, 1L, 1L, 1L, 1L, 1L, 1L, 1L, 1L, 
1L, 1L)), .Names = c("ItemRelation", "SaleCount", "DocumentNum", 
"IsPromo"), class = "data.frame", row.names = c(NA, -52L))

如您所见,此过程中的关键是能够使用适当的值子集来ItemRelation DocumentNum CalendarYear X1 X2 X3 X4 X5 X6 1 11709 1002 2018 any value any value any value 0 any value 0-x4=0 library(dplyr) mydat %>% group_by(ItemRelation, DocumentNum) %>% summarise(X1 = sum(SaleCount[SaleCount > 0 & IsPromo == 0]), X2 = sum(SaleCount[SaleCount < 0 & IsPromo == 0]), X3 = X1 + X2, X4 = X3/sum(SaleCount > 0 & IsPromo == 0), X5 = sum(SaleCount[IsPromo == 1]), X6 = X5/sum(SaleCount > 0 & IsPromo == 1) - X3/sum(SaleCount > 0 & IsPromo == 0)* sum(SaleCount > 0 & IsPromo == 1)) %>% ungroup() # # A tibble: 2 x 8 # ItemRelation DocumentNum X1 X2 X3 X4 X5 X6 # <int> <int> <int> <int> <int> <dbl> <int> <dbl> # 1 11627 3271 157 -54 103 12.9 104 -59.9 # 2 11628 3270 157 -54 103 12.9 104 -59.9 。例如:sum将计算SaleCount仅适用于正sum(SaleCount[SaleCount > 0 & IsPromo == 0])sum等于SaleCount

以类似的方式,我们可以使用IsPromo来计算具有正0sum(SaleCount > 0 & IsPromo == 0)等于SaleCount的观测值,因为我们得到了IsPromo0值的(逻辑)向量的sum

为了您的编辑尝试这个:

TRUE
© www.soinside.com 2019 - 2024. All rights reserved.