使用 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
R语言dplyr包使用group_by函数和summarise函数构建频率表实战