如何在r中对数据框中的特定列应用函数列表

3z6pesqy  于 2023-02-17  发布在  其他
关注(0)|答案(4)|浏览(110)

我有一个数据框
| 河流|放电|
| - ------|- ------|
| 河流1|五百|
| 河流1|四百五十|
| 河流1|二百|
| 河流1|二百五十|
| 河流2|三百七十五|
| 河流2|二百三十五|
| 河流2|一百三十|
| 河流2|二百五十|
我想把下面列出的函数应用于列放电。

f <- list(
  mean = function(x, ...) mean(x), 
  Q50 = function(x, ...) lfquantile(x, exc.freq = 0.5),
  Q95 = function(x, ...) lfquantile(x, exc.freq = 0.95),
  Q90 = function(x, ...) lfquantile(x, exc.freq = 0.9),
  Q70 = function(x, ...) lfquantile(x, exc.freq = 0.7),
)

最后我应该有这样一张table
| 河流|均值|第五十题|九五|九零|七〇|
| - ------|- ------|- ------|- ------|- ------|- ------|
| 河流1||||||
| 河流2||||||
| 里弗恩||||||
我不知道该怎么做

6g8kf2rb

6g8kf2rb1#

如果我们有所有可用的函数,那么使用

library(dplyr)
library(purrr)
imap_dfc(f, ~ df1 %>% 
    group_by(river) %>%
    reframe(!! .y := .x(discharge)))
5t7ly7z5

5t7ly7z52#

您可以使用group_by()函数并应用统计信息列表来计算汇总,而无需编写函数:
库(dplyr)

df %>% 
  group_by(river)%>% 
  summarize(
    mean = mean(discharge),
    q50 = quantile(discharge, 0.50),
    q95 = quantile(discharge, 0.95),
    q90 = quantile(discharge, 0.90),
    q70 = quantile(discharge, 0.70)
  )

输出为:

river   mean  q50   q95   q90   q70
 river1  350   350   492   485   455 
 river2  248   242   356   338   262
niknxzdl

niknxzdl3#

一种基于R**的方法。在本例中,将lfquantile替换为quantile

func <- list(mean = function (x, ...) mean(x), 
Q50 = function (x, ...) quantile(x, probs = 0.5), 
Q95 = function (x, ...) quantile(x, probs = 0.95), 
Q90 = function (x, ...) quantile(x, probs = 0.9), 
Q70 = function (x, ...) quantile(x, probs = 0.7))
setNames(aggregate(discharge ~ river, df, function(x) 
  setNames(sapply(names(func), function(nm) 
    func[[nm]](x)), names(func))), c("river", ""))
   river   mean    Q50    Q95    Q90    Q70
1 river1 350.00 350.00 492.50 485.00 455.00
2 river2 247.50 242.50 356.25 337.50 262.50
数据
df <- structure(list(river = c("river1", "river1", "river1", "river1", 
"river2", "river2", "river2", "river2"), discharge = c(500L, 
450L, 200L, 250L, 375L, 235L, 130L, 250L)), class = "data.frame", 
row.names = c(NA, -8L))
disbfnqx

disbfnqx4#

library(tidyverse)

func <- list(mean = function (x, ...) mean(x), 
             Q50 = function (x, ...) quantile(x, probs = 0.5), 
             Q95 = function (x, ...) quantile(x, probs = 0.95), 
             Q90 = function (x, ...) quantile(x, probs = 0.9), 
             Q70 = function (x, ...) quantile(x, probs = 0.7))

df %>%
  group_by(river) %>%
  summarise_at(vars(discharge), func)
#> # A tibble: 2 × 6
#>   river   mean   Q50   Q95   Q90   Q70
#>   <chr>  <dbl> <dbl> <dbl> <dbl> <dbl>
#> 1 river1  350   350   492.  485   455 
#> 2 river2  248.  242.  356.  338.  262.

df %>%
  group_by(river) %>%
  summarise(across(discharge, func))
#> # A tibble: 2 × 6
#>   river  discharge_mean discharge_Q50 discharge_Q95 discharge_Q90 discharge_Q70
#>   <chr>           <dbl>         <dbl>         <dbl>         <dbl>         <dbl>
#> 1 river1           350           350           492.          485           455 
#> 2 river2           248.          242.          356.          338.          262.

创建于2023年2月8日,使用reprex v2.0.2

编辑

由于quantile函数是矢量化的,因此您可以执行以下操作:

library(tidyverse)

func1 <- function(x){
  qnts <- quantile(x, probs = c(0.5,0.95,0.9,0.7))
  qnts <- setNames(qnts, paste0('Q', c(50,95,90,70)))
  data.frame(mean = mean(x), as.list(qnts))
}

df %>%
  summarise(across(discharge, func1, .unpack = TRUE), .by = river)
#>    river discharge_mean discharge_Q50 discharge_Q95 discharge_Q90 discharge_Q70
#> 1 river1          350.0         350.0        492.50         485.0         455.0
#> 2 river2          247.5         242.5        356.25         337.5         262.5

创建于2023年2月8日,使用reprex v2.0.2

相关问题