Определить медиану переменной, в которой последовательные 0 приходят в другую переменную - PullRequest
0 голосов
/ 11 мая 2018

Ниже приведены мои данные.

 Group, Sales,flag,Count
Paris,6738,0,15
Paris,5235,1,23
Paris,5907,1,15
Paris,5527,0,28
Paris,6934,1,27
Paris,6757,0,20
Paris,5394,1,31
Paris,5379,0,36
Paris,6266,1,40
Paris,5512,1,39
Paris,6506,1,29
Paris,5006,1,22
Paris,6465,1,17
Paris,6653,0,38
Paris,6719,0,12
New York,5333,1,19
New York,6763,1,37
New York,6468,0,32
New York,6923,0,34
New York,6705,0,16
New York,6542,0,11
New York,6497,0,19
New York,6616,0,27
New York,6788,0,26
New York,5876,1,33
New York,5382,0,40
New York,5688,0,34
New York,6667,1,20
New York,5929,1,28
New York,6096,0,30

Для каждого города я хотел бы рассчитать средние продажи для последовательных нулей, которые лежат до и после флага «1», для каждого города.

Ниже приведен вывод, который я получаю после использования приведенного ниже кода, предложенного в комментариях.

setDT(c)[, .(median(Sales), median(Count)), .(City, rleid(flag))][rleid %% 2 == 1, .(City, median = V1, count = V2)]

и ниже - вывод, который я получаю после использования предложенного кода.

head(d,20)
    City  median   count
1: Paris 6738.000 15.00000
2: Paris 5527.000 28.00000
3: Paris 6757.000 20.00000
4: Paris 5379.000 36.00000
5: Paris 6686.000 25.00000
6:    NY 6648.429 23.57143
7:    NY 5535.000 37.00000
8:    NY 6096.000 30.00000

Ожидаемый результат был прикреплен ниже. Расхождение наступает для группы NY, (Медиана по продажам и количеству)

R Результат вывода кода: 6. Нью-Йорк - 6648,429 и граф - 23,57

Результат вывода в Excel: NY - 6616 и граф - 26

enter image description here

Спасибо, Jay

Ответы [ 2 ]

0 голосов
/ 11 мая 2018

Base-R

x <- read.csv(header=TRUE, stringsAsFactors=FALSE, text='
City, Sales, flag
Paris, 3000, 0
Paris, 4000, 0
Paris, 5000, 0
Paris, 3000, 1
Paris, 3000, 0
Paris, 4000, 0
Paris, 4500, 0
NY, 3000, 1
NY, 4000, 0
NY, 5000, 0
NY, 3000, 1
NY, 3000, 0
NY, 4000, 0
NY, 4500, 1')

do.call(rbind,
        by(x, list(x$City, cumsum(c(0,diff(x$flag)!=0))),
           function(a) { a$Sales <- mean(a$Sales) ; a[1,,drop=FALSE] ; }))
#     City    Sales flag
# 1  Paris 4000.000    0
# 4  Paris 3000.000    1
# 5  Paris 3833.333    0
# 8     NY 3000.000    1
# 9     NY 4500.000    0
# 11    NY 3000.000    1
# 12    NY 3500.000    0
# 14    NY 4500.000    1

dplyr

library(dplyr)
x %>%
  mutate(flaggroup = cumsum(c(0,diff(flag)!=0))) %>%
  group_by(City, flaggroup) %>%
  summarize(Sales = mean(Sales), flag = first(flag)) %>%
  ungroup() %>%
  select(-flaggroup)
# # A tibble: 8 × 3
#    City    Sales  flag
#   <chr>    <dbl> <int>
# 1    NY 3000.000     1
# 2    NY 4500.000     0
# 3    NY 3000.000     1
# 4    NY 3500.000     0
# 5    NY 4500.000     1
# 6 Paris 4000.000     0
# 7 Paris 3000.000     1
# 8 Paris 3833.333     0
0 голосов
/ 11 мая 2018

Вы можете использовать rleid из data.table, чтобы вычислить среднее значение для City и rle группы (0 и 1 с), затем выберите где group == 0.

library(data.table)
setDT(data)[, .(mean(Sales), mean(Count)), .(City, rleid(flag))][rleid %% 2 == 1, .(City, average = V1, count = V2)]

    City  average
1: Paris 4000.000
2: Paris 3833.333
3:    NY 4500.000
4:    NY 3500.000

data[, rleid(flag)]вывод: [1] 1 1 1 2 3 3 3 4 5 5 6 7 7 8

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...