захватить соответствующее значение из переменной с помощью функции - PullRequest
0 голосов
/ 23 мая 2018

df

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», для каждого города.

Нижекод, который я использую.

do.call(rbind,
        by(x, list(x$City, cumsum(c(0,diff(x$flag)!=0))),
           function(a) { a$Sales <- median(a$Sales) ; a[1,,drop=FALSE] ; }))

Я также хочу вычислить соответствующее значение Count для каждой идентифицированной медианы ($ Sales). Например, Счет - 27 для 6616 (Нью-Йорк, FLag = 0).

enter image description here

Не уверен, как настроить код, для достижения желаемого результата.

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

1 Ответ

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

Улучшение существующей работы OP, вы можете использовать approx, чтобы оценить этот счет, когда количество obs является четным.

ans <- do.call(rbind,
    by(df, paste(df$City, cumsum(c(0, diff(df$Flag)!=0))),
        function(a) { 
            if (nrow(a) > 1) {
                m <- median(a$Sales)
                pc <- approx(a$Sales, a$Count, m)$y
            } else {
                m <- a$Sales[1L]
                pc <- a$Count[1L]
            }
            data.frame(Group=a$Group[1L], Flag=a$Flag[1L], Median=m, PredCount=pc)
        })
)
ans[ans$Flag==0,]

data:

df <- read.csv(text="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")
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...