用一个函数总结 returns 列表中的多个值

Summarize with a function that returns multiple values in a list

我有一个函数接收两个向量和returns一个参数列表,类似于这个:

f <- function(x, n) {
    mu <- sum(x)/sum(n)
    max <- max(x/n)
    min <- min(x/n)
    return(list(mu = mu, max = max, min = min))
}

现在,我想将该函数应用于分组数据框,并取回一个包含 mumaxmin 列和分组变量 [= 的新数据框18=].

我尝试用 summarize 做如下:

data %>% group_by(level) %>% summarize(p=f(x=x, n=n))

但我得到的不是具有第四列的数据框,而是具有两列的数据框,其中第二列包含一个条目,用于为包装为单元素列表的函数输出的每个参数。

我可以处理该数据框以生成我想要的格式如下:

data2 %>%
  transmute(level=level, col=names(p), value=p[[1]]) %>%
  pivot_wider(names_from=col, values_from=value)

但是看起来很复杂很丑陋,那么,有没有更简单的方法呢?

更新:完整代码:

n <- sample(100, size=10, replace=TRUE)
x <- rbinom(100, n, 0.5)
level <- sample(c("a", "b", "c"), 100, replace=TRUE)
data <- data.frame(level=level, x=x, n=n)

f <- function(x, n) {
    mu <- sum(x)/sum(n)
    max <- max(x/n)
    min <- min(x/n)
    return(list(mu = mu, max = max, min = min))
}

data2 <- data %>% group_by(level) %>% summarize(p=f(x=x, n=n))

data3 <- data2 %>%
    transmute(level=level, col=names(p), value=p[[1]]) %>%
    pivot_wider(names_from=col, values_from=value)

您可以通过在函数 f 中将 return(list(mu = mu, max = max, min = min)) 替换为 return(tibble(mu = mu, max = max, min = min)) 并像这样使用它来做到这一点:

df %>% group_by(group) %>% summarise(f(x, y))

其中group是分组变量,xy是要在函数中使用的变量f