首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >问答首页 >根据一组条件,计算多列中每行的自定义平均值

根据一组条件,计算多列中每行的自定义平均值
EN

Stack Overflow用户
提问于 2021-02-12 01:01:40
回答 1查看 39关注 0票数 1

我有一个复杂的问题,如果有人能帮助我,我将不胜感激。我有一个由不同国家不同年份的附加调查数据组成的数据框架。在上述数据框中,我也有受访者所在地区的空气质量指标。空气质量数据为1998 - 2016年。

我的问题是,我想要根据受访者的年龄和空气质量数据年来计算每个人的行平均值(或累积平均暴露量)。我的数据框如下所示

代码语言:javascript
运行
复制
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中完成这项复杂任务的一种方法吗?

注:虽然我的问题与我发布的另一个问题类似(见下面的链接),但这个任务非常复杂。我试着调整前一个问题的解决方案,但我的尝试不起作用。例如,我试过

代码语言:javascript
运行
复制
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?

谢谢

EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2021-02-12 01:18:20

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

代码语言:javascript
运行
复制
tidy_data = dat %>%
  pivot_longer(
    starts_with("Ozone"),
    names_pattern = "(.*)_(.*)",
    names_to = c(NA, "year"),
    values_to = "ozone"
  ) %>% 
  mutate(year = as.integer(year))

现在,您可以根据国家/年龄过滤出希望获得平均曝光量的年份:

代码语言:javascript
运行
复制
mean_lifetime_exposure = tidy_data %>%
  group_by(CNT, dob) %>%
  filter(year >= dob) %>%
  summarise(mean(ozone))

另外,对不起,我不太明白你关于乡村AO的第一个问题。

编辑:

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

代码语言:javascript
运行
复制
tidy_data_filtered = tidy_data %>%
  filter(
    !(CNT == "AO" & year != 1998),
    !(CNT == "SL" & !year %in% 1998:2014)
  )
票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/66159264

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档