我有一个复杂的问题,如果有人能帮助我,我将不胜感激。我有一个由不同国家不同年份的附加调查数据组成的数据框架。在上述数据框中,我也有受访者所在地区的空气质量指标。空气质量数据为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.*链接到上一个问题
How to compute a custom mean for each row over multiple columns, based on a row-specific criterion?
谢谢
发布于 2021-02-12 01:18:20
上一个问题的整理步骤效果很好:
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)
)https://stackoverflow.com/questions/66159264
复制相似问题