我有以下测试数据:
actions.intent.TRANSACTION_REQUIREMENTS_CHECK
我想写一个函数,用一个均值来总结分组列,我希望我可以得到前缀为“mean _”的结果列
library(tidyverse)
df <- tibble(
g1 = c(1, 1, 2, 2, 2),
g2 = c(a, a, a, b, b),
a = sample(5),
b = sample(5)
)
如果没有rename_at行,它可以正常工作,但是它会抛出错误:
my_summarise1 <- function(df, group_var, summarise_var) {
df %>%
group_by_at(.vars = group_var) %>%
summarise_at(.vars = summarise_var, .funs= mean) %>%
rename_at(.vars= summarise_var, .funs=paste('mean_', .))
}
R回复
my_summarise1(df, vars(g1,g2),vars(a,b))
我应该如何有效地为新列名添加前缀?
更小的问题:是否可以避免vars()或引用arount参数 调用函数时的列名?
了解这两件小事将大大增强我的代码,非常感谢大家提前寻求帮助。
答案 0 :(得分:3)
虽然@docendodiscimus的早期答案更简洁,但是对于它的价值,你的代码有两个问题:
paste
中包含paste0
(更好:funs
)功能。ungroup
(请参阅例如this post)。您的代码的工作版本如下所示:
my_summarise1 <- function(df, group_var, summarise_var) {
df %>%
group_by_at(group_var) %>%
summarise_at(summarise_var, mean) %>%
ungroup() %>%
rename_at(summarise_var, funs(paste0('mean_', .)))
}
my_summarise1(df, vars(g1, g2), vars(a, b))
## A tibble: 3 x 4
# g1 g2 mean_a mean_b
# <dbl> <chr> <dbl> <dbl>
#1 1. a 2.50 2.50
#2 2. a 4.00 5.00
#3 2. b 3.00 2.50
答案 1 :(得分:2)
如果您想采用简单的路线,可以使用dplyr的方法将后缀添加到汇总列中:
my_summarise1 <- function(df, group_var, summarise_var) {
df %>%
group_by_at(.vars = group_var) %>%
summarise_at(.vars = summarise_var, funs(mean=mean))
}
my_summarise1(df, vars(g1,g2), vars(a,b))
# A tibble: 3 x 4
# Groups: g1 [?]
g1 g2 a_mean b_mean
<dbl> <chr> <dbl> <dbl>
1 1. a 3.50 4.50
2 2. a 4.00 1.00
3 2. b 2.00 2.50
在这种情况下,funs(mean=mean)
告诉dplyr使用后缀mean
并应用函数mean
。为清楚起见,您可以使用funs(mysuffix = mean)
来使用任何不同的后缀并应用mean
函数。
回复OP的评论问题:您可以使用以下修改,在调用函数时不需要使用vars
。
my_summarise2 <- function(df, group_var, summarise_var) {
df %>%
group_by_at(.vars = group_var) %>%
summarise_at(.vars = summarise_var, funs(mean=mean))
}
my_summarise2(df, c("g1","g2"), c("a","b"))