如何计算相邻行的平均值?

3
我得到了一个包含人们工资数据和职位信息的DF。每一行代表一个人。我需要计算相同职位上3个人的平均工资,并创建一个新的DF。这3个人必须在同一职位上,如果按工资从高到低排序,则他们的工资必须是相邻的。该DF中的人自己以及与他们相同职位的上下两个人的平均工资。最高和最低薪水的人被排除掉,因为他们没有任何人在他们的上面或下面。
这是我的数据样本
Job     salary
IT       5000
IT       4500
IT       4000
IT       4000
Sales    4500
Sales    4500
Sales    4000
Sales    3000
Sales    2500
HR       3000
HR       2500
HR       2300
这是我想要的结果(如果平均工资带有小数位,我已经四舍五入了。但在R DF中不需要这样做。小数位是可以的):
Job    salary
IT      4500
IT      4167
Sales   4333
Sales   3833
Sales   3167
HR      2600
我陷入了困境,因为我无法计算相同职位上3个人的平均工资并排除掉最高和最低薪水的人。希望您能帮忙。
谢谢!
2个回答

3
你想要按组计算滚动平均值。可以使用zoo::rollmean配合dplyr::group_by实现。
library(dplyr)
library(zoo)

dat %>% 
  group_by(Job) %>% 
  summarise(mean = rollmean(salary, 3, align = "right"))

  Job    mean
  <fct> <dbl>
1 IT    4500 
2 IT    4167.
3 Sales 4333.
4 Sales 3833.
5 Sales 3167.
6 HR    2600 

谢谢,这正是我想要的。(align = "right") 是做什么用的? - Picataro
它强制滚动平均数在当前值之后使用n个值进行计算(其他选项是居中和左侧)。 - Maël
1
请注意,带有字母r结尾的rollmeanr函数默认对齐方式为“右对齐”。 - G. Grothendieck

1

以下是一些基本的R选项

> with(df,stack(tapply(salary, Job, function(x) rowMeans(embed(x, 3)))))
    values   ind
1 2600.000    HR
2 4500.000    IT
3 4166.667    IT
4 4333.333 Sales
5 3833.333 Sales
6 3166.667 Sales

> aggregate(salary ~ ., df, function(x) rowMeans(embed(x, 3)))
    Job                       salary
1    HR                         2600
2    IT           4500.000, 4166.667
3 Sales 4333.333, 3833.333, 3166.667

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接