我有一个关于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条件,即使Year列设置为整数。第二,即使我设置为在else条件下也计算平均值,(每组中的)所有行都填充有相同的数字,我不知道它来自何处(它接近于一般平均值)组中的一组,但不相同)。
有没有简单的方法可以做到这一点?谢谢
在按“ ID”分组后+
,我们可以使用oflag
和lead
and除以2。将default
在这两个选项lead
,并lag
都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
或者另一种选择是cbind
将lead/lag
输出,然后使用rowMeans
expenditures %>%
group_by(ID) %>%
mutate(Mean = rowMeans(cbind(lead(Spending), lag(Spending))))
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))
本文收集自互联网,转载请注明来源。
如有侵权,请联系[email protected] 删除。
我来说两句