【问题标题】:Summarize with a function that returns multiple values in a list使用在列表中返回多个值的函数进行汇总
【发布时间】:2021-05-12 00:17:46
【问题描述】:

我有一个函数,它接收两个向量并返回一个参数列表,类似于这个:

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 和分组变量 level 的列。

我已尝试使用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)

【问题讨论】:

  • 您能分享datadata2 的最小子集吗?
  • @markus,我已经添加了。无论如何,下面 det 的回复正是我想要的!

标签: r summarize


【解决方案1】:

您可以通过在函数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 中使用的变量。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2023-04-03
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多