根据一组条件为多列上的每行计算自定义平均值



我有一个复杂的问题,如果有人能帮助我,我会很感激。我有一个数据框架,由不同国家在不同年份的附加调查数据组成。在上述数据框内,我亦有选定受访者所在社区的空气质素量度。空气质量数据为1998年至2016年。

我的问题是我想根据受访者的年龄和空气质量数据年份计算每个人的行平均值(或累积平均暴露量)。我的数据帧看起来像这样

dat <- data.frame(ID=c(1:2000), dob = sample(1990:2020, size=2000, replace=TRUE),
survey_year=rep(c(1998, 2006, 2008, 2014, 2019), times=80, each=5),
CNT = rep(c('AO', 'GH', 'NG', 'SL', 'UG'), times=80, each=5),
Ozone_1998=runif(2000), Ozone_1999=runif(2000), Ozone_2000=runif(2000),
Ozone_2001=runif(2000), Ozone_2002=runif(2000), Ozone_2003=runif(2000),
Ozone_2004=runif(2000), Ozone_2005=runif(2000), Ozone_2006=runif(2000),
Ozone_2007=runif(2000), Ozone_2008=runif(2000), Ozone_2009=runif(2000),
Ozone_2010=runif(2000), Ozone_2011=runif(2000), Ozone_2012=runif(2000),
Ozone_2013=runif(2000), Ozone_2014=runif(2000), Ozone_2015=runif(2000),
Ozone_2016=runif(2000))

在上面的示例数据框架中,Ao国家的所有应答者的累积平均空气质量暴露量将限于Ozone_1998,而SL国家的应答者将根据Ozone_1998至Ozone_2014计算其平均值。

下一件事是,对于15岁的SL国家的人,我想让他们的累积暴露量从Ozone_2000到Ozone_2014(他们生命的15年期间包括他们的出生年份)。一个16岁的人将有他们的平均值从Ozone_1999到Ozone_2014等。

它们是在R中完成这个复杂任务的一种方法吗?

注:虽然我的问题与我发布的另一个问题相似(见下面的链接),但这个任务要复杂得多。我试着为我之前的问题调整解决方案,但我的尝试没有奏效。例如,我尝试
dat$mean_exposure = dat %>% pivot_longer(starts_with("Ozone"), names_pattern = "(.*)_(.*)", names_to = c("type", "year")) %>% 
mutate(year = as.integer(year)) %>% group_by(ID) %>% 
summarize(mean_under5_ozone = mean(value[ between(year, survey_year,survey_year + 0) ]), .groups = "drop")

but got an error 
*Error: Problem with `summarise()` input `mean_under5_ozone`.
x `left` must be length 1
i Input `mean_under5_ozone` is `mean(value[between(year, survey_year, survey_year + 0)])`.
i The error occurred in group 1: ID = 1.*

链接到上一个问题

如何根据行特定的标准计算多列上每行的自定义平均值?

谢谢

你上一个问题的整理步骤效果很好:

tidy_data = dat %>%
pivot_longer(
starts_with("Ozone"),
names_pattern = "(.*)_(.*)",
names_to = c(NA, "year"),
values_to = "ozone"
) %>% 
mutate(year = as.integer(year))

现在您可以按国家/年龄过滤出您想要获得平均暴露的年份:

mean_lifetime_exposure = tidy_data %>%
group_by(CNT, dob) %>%
filter(year >= dob) %>%
summarise(mean(ozone))

附言:对不起,我不太明白你第一个关于AO国家的问题。

编辑:

这是你想要的吗?逻辑有点复杂,但代码很简单。

tidy_data_filtered = tidy_data %>%
filter(
!(CNT == "AO" & year != 1998),
!(CNT == "SL" & !year %in% 1998:2014)
)

相关内容

最新更新