我的要求有点复杂。
以下是我的数据的样子。
**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
谢谢, Ĵ
答案 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是否已经在数据集中。