所有数值变量的均值之间的组差异

问题描述 投票:0回答:3

我正在尝试计算,试图计算多个数值变量之间的两组平均值之间的差异。例如,如果我有以下数据:

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),并且可以专门选择数值变量以将函数应用于该解决方案。

如果您可以逐行分解代码,那将是非常好的。

非常感谢。

r dplyr mean data-manipulation
3个回答
2
投票

有许多种可能的方法可以按照您想要的方式构造输出。一种选择是将数据帧重新构造为长/宽并使其呈列状,然后简单地减去所需的列,即

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     

1
投票

这是使用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

0
投票

使用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函数,否则结果可能是错误的。

© www.soinside.com 2019 - 2024. All rights reserved.