簡體   English   中英

如何根據 r 中 for 循環中的條件計算平均值

[英]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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM