在R中按组划分的数学动作序列

在R中按组划分的数学动作序列,r,dplyr,data.table,plyr,R,Dplyr,Data.table,Plyr,我有数据。这里举个例子 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, 1162

我有数据。这里举个例子

 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))
数据包含两个group by ItemRelation+DocumentNum列

11628   3270
11627   3271
有一个Ispromo列。它只能接受两个值 0或1。 所以我需要通过SaleCount得到Ispromo的零类的非负值或零值之和<代码>仅正值之和。 在这种情况下

六, 38 33 22 3. 28 21 六,

然后我只需要得到负值的sum

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


sum=-54
那么我必须把这两个值相加!
157+-54=103
之后,我需要103除以正值的总数。 这里只有8个正值。103/8=12,875. 对于ispromo列的零类别

第一类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
以及最终的结果。从这个值
(1733333333
)我需要求出当我们103除以正值总数时ispromo的
零类的结果。

*103/8=12,875*
然后乘以第一类ispromo的正值计数 在我们的例子中,它是
6
1733333333-(12875*6)=-5991666667

必须对每组进行此数学运算

11628   3270
11627   3271
怎么做? 按预期产出

  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
或dput预期结果

    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))
使用特定数据进行编辑 如何做到这一点,如果按SaleCount计算的ispromo的零类别中,我只有零值或负值,那么默认情况下x4必须=0。 还有另一种变体: 如果一类ispromo按销售额计算,则仅计算零值或负值 然后将X6计算为X6=0-x4。 这里是数据 当然,cource可以同时是两个变体,就像我的例子一样

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

请再次检查您提供的数据和您的计算。似乎你忘记了价值观。有一个
3
和一个
-2
在计算中被忽略。然后,你必须解释你如何得到“正值总数”的
6
,然后你说
5
忽略值
33
。@AntoniosK,我昨天想问你,但我的互联网出了问题。谢谢你们的通知,我编辑了这篇文章。我真的忘记了粘贴任何值。请检查一下。我更新了帖子。有很多值,有些是我无意中错过的。现在有意义了:)我在下面发布了一个解决方案。请再次检查您提供的数据和计算。似乎你忘记了价值观。有一个
3
和一个
-2
在计算中被忽略。然后,你必须解释你如何得到“正值总数”的
6
,然后你说
5
忽略值
33
。@AntoniosK,我昨天想问你,但我的互联网出了问题。谢谢你们的通知,我编辑了这篇文章。我真的忘记了粘贴任何值。请检查一下。我更新了帖子。有很多值,有些是我无意中错过的。现在有意义了:)我在下面发布了一个解决方案。AntoniosK,我在分析数据时遇到任何问题。数据中可能存在任何情况。我编辑了这篇文章。拜托,在这种情况下你能帮我吗?谢谢。出现此问题的原因是分母为
0
。解决此问题的最简单方法是通过在流程末尾添加以下内容来更新
-Inf
Inf
中的任何列:
..%>%变异所有(~ifelse(.%in%c(-Inf,Inf),0,)
。看一看,让我知道它是否有效。它是有效的,但问题是,当我计算时,我使用条件,如果对于ispromo by SaleCount的零类别,我只有零值或负值,那么默认情况下x4必须=0。还有另一种变体:如果一类ispromo按SaleCount计算只有零值或负值,则X6计算为X6=0-x4。。。。而不仅仅是将inf替换为0。因为如果X4=5,那么6-X4=1或x6=0和0-X4=-5。在结果中,负值可能很重要。如何在脚本中包含这些附加条件?我已经更新了答案。我得到了
X4
的更新,但我不确定我得到了
X6
。看一看,让我知道。试一下
X6=ifelse(sum(SaleCount>0&IsPromo==1)==0,-abs(X4),…
,减去
X4
AntoniosK的绝对值,我在分析数据时遇到任何问题。数据中可能存在任何情况。我编辑了文章。请在这些情况下帮我一下好吗?谢谢。出现问题的原因是分母是
0
。最简单的解决方法是更新任何列是
-Inf
Inf
的,通过在进程末尾添加以下内容:
..%>%mutate\u all(~ifelse(.%in%c(-Inf,Inf),0,)
。看一看,让我知道它是否有效。这是有效的,但问题是,当我计算时,我使用条件如果对于SaleCount的ispromo的零类别,我只有零值或负值,那么默认情况下x4必须=0。还有另一个变量:如果对于SaleCount的ispromo的一个类别,只有零值或负值,那么X6计算为X6=0-x4…,而不仅仅是将inf替换为0。因为如果x4=5,那么6-x4=1或X6=0和0-x4=-5。在结果中,负值可能很重要。如何在脚本中包含这些附加条件?我已经更新了答案。我得到了
x4
的更新,但我不确定我得到了
X6
。请看一看,让我确定现在,试试
X6=ifelse(sum(SaleCount>0&IsPromo==1)==0,-abs(X4),…
,它减去
X4的绝对值
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
mydat %>% 
  group_by(ItemRelation, DocumentNum) %>% 
  summarise(X1 = sum(SaleCount[SaleCount > 0 & IsPromo == 0]), 
            X2 = sum(SaleCount[SaleCount < 0 & IsPromo == 0]), 
            X3 = X1 + X2, 
            X4 = ifelse(sum(SaleCount > 0 & IsPromo == 0)==0, 0, X3/sum(SaleCount > 0 & IsPromo == 0)),
            X5 = sum(SaleCount[IsPromo == 1]),
            X6 = ifelse(sum(SaleCount > 0 & IsPromo == 1)==0, -X4,  
                        X5/sum(SaleCount > 0 & IsPromo == 1) - 
                        X3/sum(SaleCount > 0 & IsPromo == 0)*
                        sum(SaleCount > 0 & IsPromo == 1))) %>% 
  ungroup() %>%
  mutate_all(~ifelse(. %in% c(-Inf, Inf), 0, .))