私は複雑な問題を抱えています。誰かが私を助けてくれればありがたいです。さまざまな年のさまざまな国の調査データを追加して構成されたデータフレームがあります。上記のデータフレームには、回答者が選ばれた地域の大気質測定値もあります。大気質データは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))
PS申し訳ありませんが、国AOについての最初の質問がよくわかりません。
編集:
これはあなたが望んでいたことをしますか?ロジックは少し複雑ですが、コードは単純です。
tidy_data_filtered = tidy_data %>%
filter(
!(CNT == "AO" & year != 1998),
!(CNT == "SL" & !year %in% 1998:2014)
)
この記事はインターネットから収集されたものであり、転載の際にはソースを示してください。
侵害の場合は、連絡してください[email protected]
コメントを追加