我想通过保持连续列为行,分类因子为列标题进行分组,聚合记录为平均值或最小值或最大值。这是一个基本问题,我无法找到答案。以虹膜数据为例。我想得到每个物种类别的萼片宽度和萼片长度的平均值。
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_longer
和pivot_wider
重塑数据。如果你经常这样做,你可以把代码放入一个方便的函数中,一步到位:
注意:我还放弃了summarise_at
,并使用across
和where
切换到新的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