如何获得R中上一行和下一行上的值之间的平均值?
我有一个关于R的数据框架,其中包含多年来许多团体的支出。基本上是这样的(灰色列): 我想在上一年和下一年支出的基础上,加上黄色栏所示各年支出的平均值 我尝试使用以下代码:如何获得R中上一行和下一行上的值之间的平均值?,r,dplyr,R,Dplyr,我有一个关于R的数据框架,其中包含多年来许多团体的支出。基本上是这样的(灰色列): 我想在上一年和下一年支出的基础上,加上黄色栏所示各年支出的平均值 我尝试使用以下代码: expenditures %>% group_by(id) %>% mutate( avg_exp = ifelse(year != 2011 && year != 2008, mean(c(
expenditures %>%
group_by(id) %>%
mutate(
avg_exp = ifelse(year != 2011 && year != 2008,
mean(c(
Spending[Year %in% (Year-1)],
Spending[Year %in% (Year+1)])),
NA)) %>%
View()
然而,我保留着各种奇怪的数字。首先,ifelse只应用else条件,即使年列被设置为整数。其次,即使我也在else条件下计算平均值,所有行(每组中)都填充了相同的数字,我不知道它来自何处(接近组的总体平均值,但不相同)
有什么简单的方法可以做到这一点吗?
谢谢我们可以使用
滞后
和领先
的+
并在按“ID”分组后除以2。lead
和lag
中的default
选项都是NA
因此,第一个和最后一个“年”将是NA
中的“平均值”列
library(dplyr)
expenditures %>%
group_by(ID) %>%
mutate(Mean = (lead(Spending) + lag(Spending))/2)
-输出
# A tibble: 12 x 4
# Groups: ID [3]
# ID Year Spending new
# <int> <int> <dbl> <dbl>
# 1 1 2008 55 NA
# 2 1 2009 57 60
# 3 1 2010 65 63.5
# 4 1 2011 70 NA
# 5 2 2008 80 NA
# 6 2 2009 87 85
# 7 2 2010 90 91
# 8 2 2011 95 NA
# 9 3 2008 120 NA
#10 3 2009 123 125
#11 3 2010 130 129
#12 3 2011 135 NA
数据
支出这里有一个基本R选项,使用嵌入在ave
transform(
expenditures,
Mean = ave(Spending,ID,FUN = function(x) c(NA,rowMeans(embed(x,3)[,-2]),NA))
)
给
ID Year Spending Mean
1 1 2008 55 NA
2 1 2009 57 60.0
3 1 2010 65 63.5
4 1 2011 70 NA
5 2 2008 80 NA
6 2 2009 87 85.0
7 2 2010 90 91.0
8 2 2011 95 NA
9 3 2008 120 NA
10 3 2009 123 125.0
11 3 2010 130 129.0
12 3 2011 135 NA
数据
> dput(expenditures)
structure(list(ID = c(1L, 1L, 1L, 1L, 2L, 2L, 2L, 2L, 3L, 3L,
3L, 3L), Year = c(2008L, 2009L, 2010L, 2011L, 2008L, 2009L, 2010L,
2011L, 2008L, 2009L, 2010L, 2011L), Spending = c(55, 57, 65,
70, 80, 87, 90, 95, 120, 123, 130, 135)), class = "data.frame", row.names = c(NA,
-12L))
这里是一个数据。表
用shift
回答:
library(data.table)
setDT(expenditures)
expenditures[, Mean := (shift(Spending) + shift(Spending, type = 'lead'))/2, ID]
expenditures
# ID Year Spending Mean
# 1: 1 2008 55 NA
# 2: 1 2009 57 60.0
# 3: 1 2010 65 63.5
# 4: 1 2011 70 NA
# 5: 2 2008 80 NA
# 6: 2 2009 87 85.0
# 7: 2 2010 90 91.0
# 8: 2 2011 95 NA
# 9: 3 2008 120 NA
#10: 3 2009 123 125.0
#11: 3 2010 130 129.0
#12: 3 2011 135 NA
我认为您需要延迟
,并且将&
更改为&
哦,没错,切换到&
解决了ifelse问题,但它仍然使用相同的错误数字填充所有正确的行。另一个选项是将其视为线性过滤问题-作为.vector(stats::filter(c(80,87,90,95),c)(0.5,0,0.5))
例如,这里有更复杂的应用程序-
> dput(expenditures)
structure(list(ID = c(1L, 1L, 1L, 1L, 2L, 2L, 2L, 2L, 3L, 3L,
3L, 3L), Year = c(2008L, 2009L, 2010L, 2011L, 2008L, 2009L, 2010L,
2011L, 2008L, 2009L, 2010L, 2011L), Spending = c(55, 57, 65,
70, 80, 87, 90, 95, 120, 123, 130, 135)), class = "data.frame", row.names = c(NA,
-12L))
library(data.table)
setDT(expenditures)
expenditures[, Mean := (shift(Spending) + shift(Spending, type = 'lead'))/2, ID]
expenditures
# ID Year Spending Mean
# 1: 1 2008 55 NA
# 2: 1 2009 57 60.0
# 3: 1 2010 65 63.5
# 4: 1 2011 70 NA
# 5: 2 2008 80 NA
# 6: 2 2009 87 85.0
# 7: 2 2010 90 91.0
# 8: 2 2011 95 NA
# 9: 3 2008 120 NA
#10: 3 2009 123 125.0
#11: 3 2010 130 129.0
#12: 3 2011 135 NA