【问题标题】:Loop over character vector in R with group_by, summarise and max()使用 group_by、summary 和 max() 循环 R 中的字符向量
【发布时间】: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")

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

【问题讨论】:

标签: r for-loop group-by max


【解决方案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 包有关
猜你喜欢
  • 1970-01-01
  • 2019-09-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2020-05-10
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多