使用 group_by、summary 和 max() 循环 R 中的字符向量

Posted

技术标签:

【中文标题】使用 group_by、summary 和 max() 循环 R 中的字符向量【英文标题】:Loop over character vector in R with group_by, summarise and max() 【发布时间】:2021-11-06 17:24:32 【问题描述】:

我有一个要分组的数据集,然后得到每个组输出的最大值、第二大值和总数。在示例数据集 mtcars 上,它看起来像这样:

df <- mtcars %>% group_by(cyl) %>%
  dplyr::summarise(
    MaxVal = max(hp, na.rm = T),
    MAXsecVal = max(hp[hp != max(hp)], na.rm = F),
    Sum = sum(hp)
  ) %>%  arrange(cyl)

 cyl MaxVal MAXsecVal   Sum
  <dbl>  <dbl>     <dbl> <dbl>
1     4    113       109   909
2     6    175       123   856
3     8    335       264  2929

并且有效。但现在我想动态访问 (max, sum) 变量。最好的方法是这样的字符向量:

var <- c("hp", "drat", "wt")

可以通过循环或类似的方式在现有程序上运行。有人有想法吗?

【问题讨论】:

这能回答你的问题吗? Dynamically selecting multiple columns for group_by 【参考方案1】:

请在下面找到您的问题的解决方案(如果我理解正确的话!):

library(dplyr)


# Creating a function:

my_function <- function(table, groupingVar, x)
  
  df <- table %>% group_by(get(groupingVar)) %>%
    dplyr::summarise(
      MaxVal = max(get(x), na.rm = T),
      MAXsecVal = max(get(x)[get(x) != max(get(x))], na.rm = F),
      Sum = sum(get(x))
    ) %>%  arrange(get(deparse(substitute(groupingVar))))
  
  return(df)
  



# Defining variables:

table <- mtcars                        # select your data.frame/tibble
groupingVar <- "cyl"                   # select the grouping variable
selectedCols <- c("hp", "drat", "wt")  # select the columns to be computed


# Using the function in a loop for:

results <- list()

for (i in seq(selectedCols))
  
  results[[i]] <- my_function(table = table, 
                              groupingVar = groupingVar, 
                              x=selectedCols[i])
  
  names(results)[i] <- selectedCols[i]
  colnames(results[[i]])[1] <- get(deparse(substitute(groupingVar)))

#> `summarise()` ungrouping output (override with `.groups` argument)
#> `summarise()` ungrouping output (override with `.groups` argument)
#> `summarise()` ungrouping output (override with `.groups` argument)


# Results in a list:

results
#> $hp
#> # A tibble: 3 x 4
#>     cyl MaxVal MAXsecVal   Sum
#>   <dbl>  <dbl>     <dbl> <dbl>
#> 1     4    113       109   909
#> 2     6    175       123   856
#> 3     8    335       264  2929
#> 
#> $drat
#> # A tibble: 3 x 4
#>     cyl MaxVal MAXsecVal   Sum
#>   <dbl>  <dbl>     <dbl> <dbl>
#> 1     4   4.93      4.43  44.8
#> 2     6   3.92      3.9   25.1
#> 3     8   4.22      3.73  45.2
#> 
#> $wt
#> # A tibble: 3 x 4
#>     cyl MaxVal MAXsecVal   Sum
#>   <dbl>  <dbl>     <dbl> <dbl>
#> 1     4   3.19      3.15  25.1
#> 2     6   3.46      3.44  21.8
#> 3     8   5.42      5.34  56.0

由reprex package (v0.3.0) 于 2021 年 9 月 12 日创建

【讨论】:

请不要因为 mtcars$wp 列不存在而将“wp”更改为“wt”!对您的问题进行更改会很好。 非常感谢。这正是我想要的。但是,我收到一条错误消息:错误:排序向量的长度与数据帧大小不匹配知道吗? 其实不看你的数据很难回答。通常,如果您的 data.frame 具有与 mtcars 相同的结构,它应该可以工作。 R返回的错误信息表示“groupingVar”对应的列与结果表中其他列的行数不同。也许尝试从函数中删除这行代码(注意在行首保留右括号): %>% 安排(get(deparse(substitute(groupingVar)))) 我对 mtcar 数据集有同样的错误。通过从您描述的函数中删除最后一行代码,它起作用了。谢谢! 不客气。我很高兴它有效,并祝你一切顺利。仅供参考,我已经重做了测试,两个版本的功能仍然在我身边工作......差异可能与不同的环境和/或不同版本的 dplyr 包有关

以上是关于使用 group_by、summary 和 max() 循环 R 中的字符向量的主要内容,如果未能解决你的问题,请参考以下文章

使用 group_by 和 summarise 时出现重复行

Error in Summary.factor ‘max’ not meaningful for factors

了解 dplyr 和 group_by

R语言dplyr包使用group_by函数和summarise函数构建频率表实战

使用 dplyr、group_by 和折叠或汇总连接字符串/行,但保持 NA 值 [重复]

Summarize 和 group_by 不使用因子变量