R中的回溯值表示逻辑

时间:2018-05-06 08:16:17

标签: r

我的要求有点复杂。

以下是我的数据的样子。

   **S.no      Date     City Sales  diff Indicator
1     1  1/1/2017 New York  2795     0         0
2     2 1/31/2017 New York  4248  1453         0
3     3  3/2/2017 New York  1330 -2918         1
4     4  4/1/2017 New York  3535  2205         0
5     5  5/1/2017 New York  4330   795         0
6     6 5/31/2017 New York  3360  -970         1
7     7 6/30/2017 New York  2238 -1122         1
8     8  1/1/2017    Paris  1451     0         0
9     9 1/31/2017    Paris  2339   888         0
10   10  3/2/2017    Paris  2029  -310         1
11   11  4/1/2017    Paris  1850  -179         1
12   12  5/1/2017    Paris  2800   950         1
13   13 5/31/2017    Paris  1986  -814         0
14   14 6/30/2017    Paris  3776  1790         0
15   15  1/1/2017   London  1646     0         0
16   16 1/31/2017   London  3575  1929         0
17   17  3/2/2017   London  1161 -2414         1
18   18  4/1/2017   London  1766   605         0
19   19  5/1/2017   London  2799  1033         0
20   20 5/31/2017   London  2761   -38         1
21   21 6/30/2017   London  1048 -1713         1**

diff是每个组的当前月销售额 - 上个月销售额,而指标是差异为负数或正数时。

我想计算从最后一行到第一行的每个组的逻辑,也就是反向顺序。

我希望以相反的顺序看到,当指标为1时,Sales的值。捕获Sales值与阈值(2000)的比较,用于后续步骤。

以下是两种比较案例(Capture Sales v / s Threshold)。  一个。如果捕获的销售价值,当指标为第一个(从最后一行到第一行)时,小于2000,则将捕获的值存储在每个组的新数据集中。

湾如果捕获的销售额,当指标为第一个(从最后一行到第一行)时,大于2000,则跳过该指标= 1行并移至指标= 1的下一行,并重复相同的步骤pt.a)和pt。 b)中

我想把结果放在一个新的数据集中,每个City都有一行,为我提供上述逻辑的“Sales value”以及Date。

我只是想了解如何在R中提出这个逻辑?请问功能帮助吗?

Result:
S.no   Date    City    Value(Sales)
3.  3/2/2017  New York   1330
11. 4/1/2017  Paris      1850
21. 6/30/2017 London     1048

谢谢, Ĵ

1 个答案:

答案 0 :(得分:1)

如果我们假设您的数据已经按升序排列,您可以使用基数R执行以下操作:

threshold <-  2000

my_new_df <- my_df[my_df$Indicator == 1 & my_df$Sales < threshold, ]
my_new_df

#    S.no       Date     City Sales  diff Indicator
# 3     3 2017-03-02 New York  1330 -2918         1
# 11   11 2017-04-01    Paris  1850  -179         1
# 17   17 2017-03-02   London  1161 -2414         1
# 21   21 2017-06-30   London  1048 -1713         1

现在我们拥有指标等于1且Salse值小于阈值的所有行。但是伦敦必须排成行,而我们只会看到最后一行:

my_new_df <- my_new_df[!duplicated(my_new_df$City, fromLast = T),
                       c("S.no", "Date", "City", "Sales")]
my_new_df
#    S.no       Date     City Sales
# 3     3 2017-03-02 New York  1330
# 11   11 2017-04-01    Paris  1850
# 21   21 2017-06-30   London  1048

使用fromLast中的duplicated - 参数,我们从最后一行开始检查City是否已经在数据集中。