R 确定一个变量的中位数,其中连续0到达另一个变量

R 确定一个变量的中位数,其中连续0到达另一个变量,r,R,下面是我的数据的样子 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,

下面是我的数据的样子

 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
预期输出已附在下面。 差异来自于纽约集团,销售和计数的中位数

R代码输出结果: 6.纽约-6648.429和计数-23.57

Excel输出结果: 纽约-6616和计数-26

谢谢, Jay

您可以使用data.table中的rleid计算每个城市的平均值以及rle组0和1,然后选择其中的组==0

数据[,rleidflag]输出为: [1] 1 1 2 3 3 4 5 6 7 8

Base-R
谢谢它起作用了。。。它还提供了一种在代码中捕获计数值的方法。。我刚刚更新了数据集。@我编辑了代码。很简单,只需添加。meanSales,meanCountHi,我想捕获我们在初始代码中捕获的meanSales的计数值。@jay请发布想要的输出抱歉。。。刚意识到它在少数情况下不起作用。。。输出是不同的。它将flag==1视为输出中的重复案例。我尝试了您的代码。我得到了同样的错误。它不适用于一个组。R代码输出结果:6。NY-6648.429和Count-23.57 Excel输出结果:NY-6616和Count-26请查看我的初始帖子。当然你会在那里得到不同的答案。。。当我回答这个问题时,你问的是平均数。现在你要的是中位数,同时也改变了你所有的数据。如果你在我的代码中用中位数替换平均值,纽约的那一行给你6616。杰伊,你还在出错吗?如果不是一个错误,你是否在计算中得到了可以归因于中位数与平均值之间的差异?嗨,伊万斯,这很好。我刚才有一个问题,是否有一种方法可以同时捕获输出中每个销售中值的对应计数值。您提供的当前代码有助于捕获计数的中值或平均值,但如果有一种方法可以同时从初始数据中捕获相应的值呢。我看到的唯一挑战是观察的数量。对于奇数,它可以工作,但对于偶数,它需要取计数的平均值,并提供结果。不知道如何做到这一点,但寻求你的专业知识。谢谢你的意思是加上summary…,count=n吗?杰伊,这两个答案都能解决你的问题吗?如果是,请;虽然这不是严格要求的,但它对回答者来说是一种良好的礼仪,并为发现你的问题与他们自己的问题相关的任何人提供明确的结束语。
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
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
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