Разница между группами в средних значениях для всех чисел c переменных - PullRequest
2 голосов
/ 20 января 2020

Я пытаюсь вычислить, пытаясь вычислить разницу в средних значениях между двумя группами по нескольким числовым c переменным. Например, если бы у меня были следующие данные:

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

Я хотел бы, например, вычесть средние значения 'versicolor' из средних значений 'setosa' и сохранить их как новый dataframe.

Результат выглядит примерно так:

Sepal.Length Sepal.Width Petal.Length Petal.Width    
1          0.1         0.3          0.18         0.0     

Мне бы очень хотелось сделать это с помощью dplyr, который я сейчас изучаю. Кроме того, в идеале решение может быть применено к гораздо большему массиву данных (100 переменных) и может специально выбирать числовые c переменные для применения функции.

Если бы вы могли разбивать код несколько строк за строкой, это было бы действительно превосходно.

Большое спасибо.

Ответы [ 3 ]

3 голосов
/ 20 января 2020

Вот способ сделать это с 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
3 голосов
/ 20 января 2020

Есть много возможных способов сделать это и структурировать вывод так, как вы этого хотите. Один из вариантов - перестроить фрейм данных в длинный / широкий и привести его к столбчатой ​​форме, а затем просто вычесть нужные столбцы, например

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     
0 голосов
/ 20 января 2020

С purrr (который является частью tidyverse, например dplyr), если вы всегда вычитаете одни и те же группы, вы можете написать это:

library(tidyverse)
iris %>% 
  select(-Species) %>% 
  map_df(~{
    mean(.x[iris$Species=="setosa"])-mean(.x[iris$Species=="versicolor"])
  })

Из набора данных iris, Вы удаляете столбец "Виды", затем для каждого другого столбца вычитаете средства.

# 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 перед вызовом карты, иначе результаты могут быть неправильными.

...