Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/r/81.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
如何获得R中上一行和下一行上的值之间的平均值?_R_Dplyr - Fatal编程技术网

如何获得R中上一行和下一行上的值之间的平均值?

如何获得R中上一行和下一行上的值之间的平均值?,r,dplyr,R,Dplyr,我有一个关于R的数据框架,其中包含多年来许多团体的支出。基本上是这样的(灰色列): 我想在上一年和下一年支出的基础上,加上黄色栏所示各年支出的平均值 我尝试使用以下代码: expenditures %>% group_by(id) %>% mutate( avg_exp = ifelse(year != 2011 && year != 2008, mean(c(

我有一个关于R的数据框架,其中包含多年来许多团体的支出。基本上是这样的(灰色列):

我想在上一年和下一年支出的基础上,加上黄色栏所示各年支出的平均值

我尝试使用以下代码:

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