假设我有一个返回两个标量的函数,我想将它与 一起使用summarize,例如
fn = function(x) {
list(mean(x), sd(x))
}
iris %>%
summarize(fn(Petal.Length)) # Error: Column `fn(Petal.Length)` must be length 1 (a summary value), not 2
iris %>%
summarize(c("a","b") := fn(Petal.Length))
# Error: The LHS of `:=` must be a string or a symbol Run `rlang::last_error()` to see where the error occurred.
Run Code Online (Sandbox Code Playgroud)
两种方法我都试过,但无法弄清楚。
但是,这可以通过 data.table
library(data.table)
iris1 = copy(iris)
setDT(iris1)[, fn(Petal.Length)]
Run Code Online (Sandbox Code Playgroud)
有没有办法做到这一点dplyr?
是的,您可以将它们保存为列中的列表,然后用于unnest_wider将它们分隔在不同的列中。
fn = function(x) {
list(mean = mean(x),sd = sd(x))
}
library(dplyr)
library(tidyr)
iris %>%
summarise(temp = list(fn(Petal.Length))) %>%
unnest_wider(temp)
# A tibble: 1 x 2
# mean sd
# <dbl> <dbl>
#1 3.76 1.77
Run Code Online (Sandbox Code Playgroud)
或者unnest_longer将它们放在不同的行中
iris %>%
summarise(temp = list(fn(Petal.Length))) %>%
unnest_longer(temp)
# temp temp_id
# <dbl> <chr>
#1 3.76 mean
#2 1.77 sd
Run Code Online (Sandbox Code Playgroud)