R-按连续变量标题分组,分类变量因子为行,聚合为最小值、最大值和平均值



我想通过保持连续列为行,分类因子为列标题进行分组,聚合记录为平均值或最小值或最大值。这是一个基本问题,我无法找到答案。以虹膜数据为例。我想得到每个物种类别的萼片宽度和萼片长度的平均值。

library(dplyr)
mydata2 <-iris 
# Groupby function for dataframe in R
summarise_at(group_by(mydata2,Species),vars(Sepal.Length),funs(mean(.,na.rm=TRUE)))
OUTPUT 
Species    Sepal.Length
<fct>             <dbl>
1 setosa             5.01
2 versicolor         5.94
3 virginica          6.59

我想用Sepal.Length作为我的行,而不是用Species和Species的各种因子作为我的列,得到相同的输出。我还想要萼片宽度,花瓣长度,花瓣宽度,我该怎么做?

这就是我要找的-

Species            setosa     versicolor  virginica

1 Sepal.Length       5.01      5.94       6.59

下面应该有分隔宽度和其他连续的列。我已经尝试过转座,但这是改变一切的字符数据类型。

实现所需结果的一个选项是在summarise之后通过例如pivot_longerpivot_wider重塑数据。如果你经常这样做,你可以把代码放入一个方便的函数中,一步到位:

注意:我还放弃了summarise_at,并使用acrosswhere切换到新的API。

library(dplyr)
library(tidyr)
summarise(group_by(iris, Species), across(where(is.numeric), mean, na.rm=TRUE)) %>% 
pivot_longer(-Species, names_to = "var") %>% 
pivot_wider(names_from = Species, values_from = value)
#> # A tibble: 4 × 4
#>   var          setosa versicolor virginica
#>   <chr>         <dbl>      <dbl>     <dbl>
#> 1 Sepal.Length  5.01        5.94      6.59
#> 2 Sepal.Width   3.43        2.77      2.97
#> 3 Petal.Length  1.46        4.26      5.55
#> 4 Petal.Width   0.246       1.33      2.03

您可以使用tapply暗示lapply:

do.call(rbind, lapply(iris[sapply(iris, is.numeric)],
function(x) tapply(x, iris$Species, mean)))
#             setosa versicolor virginica
#Sepal.Length  5.006      5.936     6.588
#Sepal.Width   3.428      2.770     2.974
#Petal.Length  1.462      4.260     5.552
#Petal.Width   0.246      1.326     2.026

相关内容

最新更新