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] ; }))
我还想为每个中位数($ Sales)计算相应的Count值。 例如计数 - 为6616(纽约,FLag = 0)27。
不确定如何自定义代码,以达到理想的效果。
此外,由于我使用的是中位数,当观测数量为奇数时,它将完美地捕获相应的值,但是对于偶数个观测值,它将取中心两个项的平均值。不知道如何在现有代码中做同样的事情。
答案 0 :(得分:1)
改善OP的现有工作,您可以使用approx
来判断当数量为偶数时的计数。
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,]
数据:
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")