gpt4 book ai didi

R dplyr 将多个函数汇总到选定的变量

转载 作者:行者123 更新时间:2023-12-05 01:19:10 24 4
gpt4 key购买 nike

我有一个数据集,我想对其进行均值汇总,但也只计算其中一个变量的最大值。

让我从一个我想要实现的例子开始:

iris %>%
group_by(Species) %>%
filter(Sepal.Length > 5) %>%
summarise_at("Sepal.Length:Petal.Width",funs(mean))

这给了我以下结果

# A tibble: 3 × 5
Species Sepal.Length Sepal.Width Petal.Length Petal.Width
<fctr> <dbl> <dbl> <dbl> <dbl>
1 setosa 5.8 4.4 1.9 0.5
2 versicolor 7.0 3.4 5.1 1.8
3 virginica 7.9 3.8 6.9 2.5

是否有一种简单的方法来添加,例如,max(Petal.Width)来进行总结?

到目前为止,我已经尝试了以下方法:

iris %>%
group_by(Species) %>%
filter(Sepal.Length > 5) %>%
summarise_at("Sepal.Length:Petal.Width",funs(mean)) %>%
mutate(Max.Petal.Width = max(iris$Petal.Width))

但是通过这种方法,我丢失了上面代码中的 group_byfilter 并给出了错误的结果。

我能够实现的唯一解决方案如下:

iris %>%
group_by(Species) %>%
filter(Sepal.Length > 5) %>%
summarise_at("Sepal.Length:Petal.Width",funs(mean,max)) %>%
select(Species:Petal.Width_mean,Petal.Width_max) %>%
rename(Max.Petal.Width = Petal.Width_max) %>%
rename_(.dots = setNames(names(.), gsub("_.*$","",names(.))))

这有点令人费解,需要大量输入才能添加具有不同摘要的列。

谢谢

最佳答案

虽然这是一个老问题,但它仍然是一个有趣的问题,我有两个解决方案,我相信任何找到此页面的人都应该可以使用。

方案一

我自己的观点:

mapply(summarise_at, 
.vars = lst(names(iris)[!names(iris)%in%"Species"], "Petal.Width"),
.funs = lst(mean, max),
MoreArgs = list(.tbl = iris %>% group_by(Species) %>% filter(Sepal.Length > 5)))
%>% reduce(merge, by = "Species")

# Species Sepal.Length Sepal.Width Petal.Length Petal.Width.x Petal.Width.y
# 1 setosa 5.314 3.714 1.509 0.2773 0.5
# 2 versicolor 5.998 2.804 4.317 1.3468 1.8
# 3 virginica 6.622 2.984 5.573 2.0327 2.5

方案二

一个优雅的解决方案,使用来自 tidyverse 本身的包 purrr,灵感来自 this discussion :

list(.vars = lst(names(iris)[!names(iris)%in%"Species"], "Petal.Width"),
.funs = lst("mean" = mean, "max" = max)) %>%
pmap(~ iris %>% group_by(Species) %>% filter(Sepal.Length > 5) %>% summarise_at(.x, .y))
%>% reduce(inner_join, by = "Species")

+ + + # A tibble: 3 x 6
Species Sepal.Length Sepal.Width Petal.Length Petal.Width.x Petal.Width.y
<fct> <dbl> <dbl> <dbl> <dbl> <dbl>
1 setosa 5.31 3.71 1.51 0.277 0.5
2 versicolor 6.00 2.80 4.32 1.35 1.8
3 virginica 6.62 2.98 5.57 2.03 2.5

简短讨论

data.frame 和 tibble 是想要的结果,最后一列是 petal.widthmax,其他的是手段(按组和过滤器)所有其他列。

这两种解决方案都取决于三个实现:

  1. summarise_at 接受两个列表作为参数,n 变量之一和 m 函数之一,并应用所有 m 对所有 n 变量起作用,因此在小标题中生成 m X n 向量。因此,该解决方案可能意味着强制该函数以某种方式循环跨越由我们希望应用一个特定函数的所有变量和一个函数形成的“对”,然后是另一组变量和它们自己的函数,等等!
  2. 现在,R 中的上述内容是什么?是什么强制对两个列表的相应 元素进行操作? mapply 或函数族 map2pmap 及其变体,来自 dplyr 的 tidyverse fellow 呼噜声。两者都接受两个 l 元素列表,并对两个列表的相应元素(按位置匹配)执行给定操作。
  3. 因为产品不是 tibble 或 data.frame,而是列表,您只需要将 reduceinner_join 一起使用,或者只是 merge

请注意,我获得的方法与 OP 的方法不同,但它们也是我通过他的可重现示例获得的方法(也许我们有两个不同版本的 iris 数据集?) .

关于R dplyr 将多个函数汇总到选定的变量,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/41109403/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com