【发布时间】: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))
}
现在,我想将该函数应用于分组数据帧并返回一个新数据帧,其中包含 mu、max、min 和分组变量 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)
【问题讨论】:
-
您能分享
data或data2的最小子集吗? -
@markus,我已经添加了。无论如何,下面 det 的回复正是我想要的!