summarise_at 对不同的变量使用不同的函数
summarise_at using different functions for different variables
当我使用group_by并在dplyr中进行汇总时,我自然可以对不同的变量应用不同的汇总函数。例如:
library(tidyverse)
df <- tribble(
~category, ~x, ~y, ~z,
#----------------------
'a', 4, 6, 8,
'a', 7, 3, 0,
'a', 7, 9, 0,
'b', 2, 8, 8,
'b', 5, 1, 8,
'b', 8, 0, 1,
'c', 2, 1, 1,
'c', 3, 8, 0,
'c', 1, 9, 1
)
df %>% group_by(category) %>% summarize(
x=mean(x),
y=median(y),
z=first(z)
)
输出结果:
# A tibble: 3 x 4
category x y z
<chr> <dbl> <dbl> <dbl>
1 a 6 6 8
2 b 5 1 8
3 c 2 8 1
我的问题是,我如何使用 summarise_at 执行此操作?显然对于这个例子来说这是不必要的,但假设我有很多变量我想取平均值,很多中位数等。
我搬到 summarise_at 后会失去此功能吗?我是否必须对所有变量组使用所有函数,然后丢弃我不想要的那些?
也许我只是遗漏了一些东西,但我无法弄明白,而且我在文档中也没有看到任何这方面的例子。感谢任何帮助。
这是一个想法。
library(tidyverse)
df_mean <- df %>%
group_by(category) %>%
summarize_at(vars(x), funs(mean(.)))
df_median <- df %>%
group_by(category) %>%
summarize_at(vars(y), funs(median(.)))
df_first <- df %>%
group_by(category) %>%
summarize_at(vars(z), funs(first(.)))
df_summary <- reduce(list(df_mean, df_median, df_first),
left_join, by = "category")
就像你说的,这个例子没有必要使用summarise_at
。但是,如果您有很多列需要通过不同的函数进行汇总,则此策略可能会奏效。您需要在 vars(...)
中为每个 summarize_at
指定列。规则与dplyr::select
函数相同。
更新
这是另一个想法。定义一个修改 summarise_at
函数的函数,然后使用 map2
应用此函数,查找列表显示要应用的变量和关联函数。在此示例中,我将 mean
应用于 x
和 y
列,将 median
应用于 z
。
# Define a function
summarise_at_fun <- function(variable, func, data){
data2 <- data %>%
summarise_at(vars(variable), funs(get(func)(.)))
return(data2)
}
# Group the data
df2 <- df %>% group_by(category)
# Create a look-up list with function names and variable to apply
look_list <- list(mean = c("x", "y"),
median = "z")
# Apply the summarise_at_fun
map2(look_list, names(look_list), summarise_at_fun, data = df2) %>%
reduce(left_join, by = "category")
# A tibble: 3 x 4
category x y z
<chr> <dbl> <dbl> <dbl>
1 a 6 6 0
2 b 5 3 8
3 c 2 6 1
由于您的问题是关于 "summarise_at";
这是我的想法:
df %>% group_by(category) %>%
summarise_at(vars(x, y, z),
funs(mean = mean, sd = sd, min = min),
na.rm = TRUE)
当我使用group_by并在dplyr中进行汇总时,我自然可以对不同的变量应用不同的汇总函数。例如:
library(tidyverse)
df <- tribble(
~category, ~x, ~y, ~z,
#----------------------
'a', 4, 6, 8,
'a', 7, 3, 0,
'a', 7, 9, 0,
'b', 2, 8, 8,
'b', 5, 1, 8,
'b', 8, 0, 1,
'c', 2, 1, 1,
'c', 3, 8, 0,
'c', 1, 9, 1
)
df %>% group_by(category) %>% summarize(
x=mean(x),
y=median(y),
z=first(z)
)
输出结果:
# A tibble: 3 x 4
category x y z
<chr> <dbl> <dbl> <dbl>
1 a 6 6 8
2 b 5 1 8
3 c 2 8 1
我的问题是,我如何使用 summarise_at 执行此操作?显然对于这个例子来说这是不必要的,但假设我有很多变量我想取平均值,很多中位数等。
我搬到 summarise_at 后会失去此功能吗?我是否必须对所有变量组使用所有函数,然后丢弃我不想要的那些?
也许我只是遗漏了一些东西,但我无法弄明白,而且我在文档中也没有看到任何这方面的例子。感谢任何帮助。
这是一个想法。
library(tidyverse)
df_mean <- df %>%
group_by(category) %>%
summarize_at(vars(x), funs(mean(.)))
df_median <- df %>%
group_by(category) %>%
summarize_at(vars(y), funs(median(.)))
df_first <- df %>%
group_by(category) %>%
summarize_at(vars(z), funs(first(.)))
df_summary <- reduce(list(df_mean, df_median, df_first),
left_join, by = "category")
就像你说的,这个例子没有必要使用summarise_at
。但是,如果您有很多列需要通过不同的函数进行汇总,则此策略可能会奏效。您需要在 vars(...)
中为每个 summarize_at
指定列。规则与dplyr::select
函数相同。
更新
这是另一个想法。定义一个修改 summarise_at
函数的函数,然后使用 map2
应用此函数,查找列表显示要应用的变量和关联函数。在此示例中,我将 mean
应用于 x
和 y
列,将 median
应用于 z
。
# Define a function
summarise_at_fun <- function(variable, func, data){
data2 <- data %>%
summarise_at(vars(variable), funs(get(func)(.)))
return(data2)
}
# Group the data
df2 <- df %>% group_by(category)
# Create a look-up list with function names and variable to apply
look_list <- list(mean = c("x", "y"),
median = "z")
# Apply the summarise_at_fun
map2(look_list, names(look_list), summarise_at_fun, data = df2) %>%
reduce(left_join, by = "category")
# A tibble: 3 x 4
category x y z
<chr> <dbl> <dbl> <dbl>
1 a 6 6 0
2 b 5 3 8
3 c 2 6 1
由于您的问题是关于 "summarise_at";
这是我的想法:
df %>% group_by(category) %>%
summarise_at(vars(x, y, z),
funs(mean = mean, sd = sd, min = min),
na.rm = TRUE)