如何得到R中 Dataframe 中每列的三分位数的平均值?

js4nwp54  于 2023-02-01  发布在  其他
关注(0)|答案(1)|浏览(167)

我试图得到我的 Dataframe 中所有变量的三分位数的长期平均值。基本上,我想要每个变量的三分位数的平均值。下面是第二个三分位数的例子。
数据结构:

DOY   city     P        BP       prune   Tmax
100 Bechem 1.283868 0.001742587  1.00 29.07214
123 Bechem 0.000000 0.002593004  0.02 30.42596
345 Bechem 0.000000 0.421595923  0.02 30.03821
100 Bechem 1.283868 0.001742587  1.00 29.07214
123 Bechem 0.000000 0.002593004  0.02 30.42596
345 Bechem 0.000000 0.393785818  0.02 29.03066
100 Bechem 1.283868 0.001742587  1.00 29.07214
123 Bechem 0.000000 0.002593004  0.02 30.42596
345 Bechem 0.000000 0.174428952  0.02 32.00171
100 Bechem 1.283868 0.001742587  1.00 29.07214

我现在做的是:

Fun_tertile_mean <- function(x,i){
  quantile<-quantile(x, c(0:3/3))
  datum <- mean(x[x<= quantile[i] & x>quantile[i-1]],na.rm = TRUE)
  return(datum)
}

Data_General_2tertile <- Data_General[Data_General$yr_prjctd %in% c(2010,2011,2012,2013,2014,2015),] %>%
    group_by(city) %>% 
      group_by(DOY) %>%
        select_if(is.numeric) %>%
          summarise_all(function(x) Fun_tertile_mean(x,3))

我得到了一个充满NaN和一些值的 Dataframe ,我不明白我定义的函数中是否有什么错误,group_by()和summarise_all()之间的交互是否有错误。
任何提示或帮助都非常感谢!

n9vozmp4

n9vozmp41#

您好,欢迎来到SO!
我认为问题是你得到的三分位数极限是相等的。如果是这样的话,你会得到一个NaN作为平均值的结果。下面是一个iris的例子:

library(tidyr)
library(dplyr)
 
data("iris")
 
 Fun_tertile_mean <- function(x, i) {
+   quantile <- quantile(x, c(0:3 / 3))
+   datum <- mean(x[x <= quantile[i] & x > quantile[i - 1]], na.rm = TRUE)
+   return(datum)
+ }
 
 iris %>% group_by(Species) %>%
+   select_if(is.numeric) %>%
+   summarise_all(function(x) Fun_tertile_mean(x, 3))

# A tibble: 3 × 5
  Species    Sepal.Length Sepal.Width Petal.Length Petal.Width
  <fct>             <dbl>       <dbl>        <dbl>       <dbl>
1 setosa             5.05        3.42         1.5       NaN   
2 versicolor         5.97        2.85         4.38        1.4 
3 virginica          6.54        2.99         5.54        2.05
 
quantile(iris[iris$Species == "setosa", "Petal.Width"], c(0:3 / 3))
       0% 33.33333% 66.66667%      100% 
      0.1       0.2       0.2       0.6

一种解决方案是使用ifelse,并取值而不是平均值:

Fun_tertile_mean <- function(x, i) {
+   quantile <- quantile(x, c(0:3 / 3), digits = 10)
+   datum <- ifelse(quantile[i] == quantile[i - 1], quantile[i], mean(x[x <= quantile[i] & x > quantile[i - 1]], na.rm = TRUE))
+   return(datum)
+ }
 
iris %>% group_by(Species) %>%
+   select_if(is.numeric) %>%
+   summarise_all(function(x) Fun_tertile_mean(x, 3))

# A tibble: 3 × 5
  Species    Sepal.Length Sepal.Width Petal.Length Petal.Width
  <fct>             <dbl>       <dbl>        <dbl>       <dbl>
1 setosa             5.05        3.42         1.5         0.2 
2 versicolor         5.97        2.85         4.38        1.4 
3 virginica          6.54        2.99         5.54        2.05

希望能有所帮助

相关问题