用一个函数总结 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))
}
现在,我想将该函数应用于分组数据框,并取回一个包含 mu
、max
、min
列和分组变量 [= 的新数据框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
是分组变量,x
和y
是要在函数中使用的变量f
。
我有一个函数接收两个向量和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))
}
现在,我想将该函数应用于分组数据框,并取回一个包含 mu
、max
、min
列和分组变量 [= 的新数据框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
是分组变量,x
和y
是要在函数中使用的变量f
。