[英]how to calculate mean based on conditions in for loop in r
我有一個我認為很簡單的問題,但我無法弄清楚。 我有一個包含多列的數據框:這是一個一般示例:
colony = c('29683','25077','28695','4865','19858','2235','1948','1849','2370','23196')
age = c(21,23,4,25,7,4,12,14,9,7)
activity = c(19,45,78,33,2,49,22,21,112,61)
test.df = data.frame(colony,age,activity)
test.df
我希望 R 根據數據框中的菌落年齡計算平均活動。 具體來說,我希望它只計算與該行中的菌落年齡相同或更老的菌落的平均活動,不包括該行中菌落的活動。 例如,菌落 29683 是 21 歲。 對於我的這行數據,我想要 21 歲以上的菌落的平均活動。 這將包括殖民地 25077 和殖民地 4865; 平均值為 (45+33)/2 = 39。我希望 R 通過識別當前行中菌落的年齡來對每一行數據執行此操作,然后識別比該菌落更老的菌落,然后平均這些殖民地的活動。
我已經嘗試在 R 的 for 循環中執行此操作。 這是我使用的代碼:
test.avg = vector("numeric",nrow(test.df))`
for (i in 1:10){
test.avg[i] <- mean(subset(test.df$activity,test.df$age >= age[i])[-i])
}
R 返回一個值列表,其中一半是正確的,另一半不是(我什至不確定它是如何計算出這些不正確的數字..)。 與 dataframe 中列出的數字相比,正確的數字也是不正確的。 它顯然能夠為循環的某些迭代做正確的事情,但不是全部。 如果有人可以幫助我編寫代碼,我將不勝感激!
colony = c('29683','25077','28695','4865','19858','2235','1948','1849','2370','23196')
age = c(21,23,4,25,7,4,12,14,9,7)
activity = c(19,45,78,33,2,49,22,21,112,61)
test.df = data.frame(colony,age,activity)
library(tidyverse)
test.df %>%
mutate(result = map_dbl(age, ~mean(activity[age > .x])))
#> colony age activity result
#> 1 29683 21 19 39.00000
#> 2 25077 23 45 33.00000
#> 3 28695 4 78 39.37500
#> 4 4865 25 33 NaN
#> 5 19858 7 2 42.00000
#> 6 2235 4 49 39.37500
#> 7 1948 12 22 29.50000
#> 8 1849 14 21 32.33333
#> 9 2370 9 112 28.00000
#> 10 23196 7 61 42.00000
# base
test.df$result <- with(test.df, sapply(age, FUN = function(x) mean(activity[age > x])))
test.df
#> colony age activity result
#> 1 29683 21 19 39.00000
#> 2 25077 23 45 33.00000
#> 3 28695 4 78 39.37500
#> 4 4865 25 33 NaN
#> 5 19858 7 2 42.00000
#> 6 2235 4 49 39.37500
#> 7 1948 12 22 29.50000
#> 8 1849 14 21 32.33333
#> 9 2370 9 112 28.00000
#> 10 23196 7 61 42.00000
由代表 package (v1.0.0) 於 2021 年 3 月 22 日創建
您可以使用 map_df:
library(tidyverse)
test.df %>%
mutate(map_df(1:nrow(test.df), ~
test.df %>%
filter(age >= test.df$age[.x]) %>%
summarise(av_acti= mean(activity))))
您的解決方案中的問題是索引將應用於原始 data.frame,但是您將其子集化,因此它不再匹配。
嘗試這樣的事情:首先找到最小年齡,然后排除當前指數並計算年齡> =預先計算的最小年齡的病例的平均活動。
for (i in 1:10){
test.avg[i] <- {amin=age[i]; mean(subset(test.df[-i,], age >= amin)$activity)}
}
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.