通过随着时间增加R的数量来子集

时间:2019-01-08 18:22:01

标签: r

我有一个数据框,其中包含卖方,年份和月份的销售计数,称为sales_by_month

library(tidyverse)
sales_by_month <- tribble(
~Seller,      ~Year,    ~Month,   ~Sales,
"John Doe",    2018,    1,       82,
"John Doe",    2018,    2,       72,
"John Doe",    2018,    3,       42,
"Sally Jane",  2018,    1,       25,
"Sally Jane",  2018,    2,       77)

我只需要按销售额随时间增长的那些卖家来对这个数据集进行子集设置,而我不知道该怎么做。

结果子集数据集应包含;

Seller      Year    Month   Sales
Sally Jane  2018    1       25
Sally Jane  2018    2       77

因为Sally的销售在增长,而John的销售在下降。

任何帮助将不胜感激!

2 个答案:

答案 0 :(得分:1)

首先,创建一个表示Sales(我将其命名为dif)中的差异的变量。如果 dif < 0 ,则表示某人的销售额中存在价值下降的情况。

library(dplyr)

df %>% arrange(Seller, Year, Month) %>%
  group_by(Seller) %>%
  mutate(dif = c(0, diff(Sales))) %>%
  filter(all(dif >= 0)) %>%
  select(-dif) # drop dif

#   Seller     Year Month Sales
#   <fct>     <int> <int> <int>
# 1 SallyJane  2018     1    25
# 2 SallyJane  2018     2    77

更简洁:

df %>% group_by(Seller) %>%
  arrange(Seller, Year, Month) %>%
  filter(all(c(0, diff(Sales)) >= 0))

答案 1 :(得分:1)

如何执行此操作实际上取决于您要如何定义随时间的增长。定义随时间增加的一种方法是是否逐月增加。我的解决方案只是查看上个月是否有所增加,但是可以更改以不同的方式查看它:

  1. 我们每个月计算一次更改。我们只过滤最后一个月,如果它是一个积极的变化。然后,我们提取出唯一的卖方名称。

  2. 我们过滤在第1部分中获得的卖家名称。

下面的代码可以做到这一点,以及可以直接加载到R中的数据框

library(tidyverse)
sales_by_month <- tribble(
~Seller,      ~Year,    ~Month,   ~Sales,
"John Doe",    2018,    1,       82,
"John Doe",    2018,    2,       72,
"John Doe",    2018,    3,       42,
"Sally Jane",  2018,    1,       25,
"Sally Jane",  2018,    2,       77)


increased_from_last_month <- sales_by_month %>% 
  group_by(Seller) %>% 
  arrange(Seller, Year, Month) %>% 
  mutate(change = Sales - lag(Sales, default = 0)) %>% 
  summarise_all(last) %>% 
  filter(change > 0) %>% 
  pull(Seller) %>% 
  unique()


sales_by_month %>% 
  filter(Seller %in% increased_from_last_month)