我正在尝试计算,试图计算多个数值变量之间的两组平均值之间的差异。例如,如果我有以下数据:
Sepal.Length Sepal.Width Petal.Length Petal.Width Species
1 5.1 3.5 1.4 0.2 setosa
2 4.9 3.0 1.4 0.2 versicolor
3 4.7 3.2 1.3 0.2 versicolor
4 4.6 3.1 1.5 0.2 setosa
5 5.0 3.6 1.4 0.2 setosa
例如,我想从'setosa'的平均值中减去'versicolor'的平均值,并将其保存为新的数据框。
结果看起来像这样:
Sepal.Length Sepal.Width Petal.Length Petal.Width
1 0.1 0.3 0.18 0.0
我真的很想使用dplyr进行此操作,目前正在学习。同样,理想情况下,该解决方案可以应用于更大的数据框(变量为100),并且可以专门选择数值变量以将函数应用于该解决方案。
如果您可以逐行分解代码,那将是非常好的。
非常感谢。
有许多种可能的方法可以按照您想要的方式构造输出。一种选择是将数据帧重新构造为长/宽并使其呈列状,然后简单地减去所需的列,即
library(dplyr)
iris1 %>%
group_by(Species) %>%
summarise_all(list(mean)) %>%
pivot_longer(cols = Sepal.Length:Petal.Width) %>%
pivot_wider(names_from = Species, values_from = value) %>%
mutate(versicolor_setosa = setosa - versicolor)
给出,
# A tibble: 4 x 4 name setosa versicolor versicolor_setosa <chr> <dbl> <dbl> <dbl> 1 Sepal.Length 4.90 4.8 0.1000 2 Sepal.Width 3.4 3.1 0.300 3 Petal.Length 1.43 1.35 0.0833 4 Petal.Width 0.2 0.2 0
这是使用dplyr
的方法:
iris %>%
filter(Species %in% c("versicolor", "setosa")) %>%
group_by(Species) %>%
summarise_all(mean) %>%
summarise_at(-1, diff)
# A tibble: 1 x 4
Sepal.Length Sepal.Width Petal.Length Petal.Width
<dbl> <dbl> <dbl> <dbl>
1 0.930 -0.658 2.80 1.08
使用purrr
(它是tidyverse
的一部分,就像dplyr
一样,如果您始终减去相同的组,则可以这样写:
library(tidyverse)
iris %>%
select(-Species) %>%
map_df(~{
mean(.x[iris$Species=="setosa"])-mean(.x[iris$Species=="versicolor"])
})
从虹膜数据集中删除“种类”列,然后对其他每一列减去均值。
# A tibble: 1 x 4 Sepal.Length Sepal.Width Petal.Length Petal.Width <dbl> <dbl> <dbl> <dbl> 1 -0.930 0.658 -2.80 -1.08
这就像为每一列写这样:
mean(iris$Sepal.Length[iris$Species=="setosa"])-mean(iris$Sepal.Length[iris$Species=="versicolor"])
请注意,在地图调用之前您不使用任何filter
函数,否则结果可能是错误的。