Пользовательская функция с dplyr мутировать или суммировать для разных уровней в пределах фактора? - PullRequest
0 голосов
/ 27 августа 2018

Вот некоторые примеры данных:

library(car)
library(dplyr)
    df1 <- mtcars %>%
                group_by(cyl, gear) %>%
                summarise(
                    newvar = sum(wt)
                )
# A tibble: 8 x 3
# Groups:   cyl [?]
    cyl  gear newvar
  <dbl> <dbl>  <dbl>
1     4     3   2.46
2     4     4  19.0 
3     4     5   3.65
4     6     3   6.68
5     6     4  12.4 
6     6     5   2.77
7     8     3  49.2 
8     8     5   6.74

Что, если я затем хотел бы применить пользовательскую функцию, вычисляющую разницу между значениями newvar для автомобилей с 3 или 5 передачами для каждого уровня цилиндра?

df2 <- df1 %>%  mutate(Diff = newvar[gear == "3"] - newvar[gear == "5"]) 

или с суммированием?

df2 <- df1 %>%  summarise(Diff = newvar[gear == "3"] - newvar[gear == "5"])

Должен быть способ применения функций для разных уровней в рамках разных факторов?

Любая помощь приветствуется!

Ответы [ 2 ]

0 голосов
/ 27 августа 2018

Вариант: spread в «широкий» формат и затем -

library(tidyverse)
df1 %>%
   filter(gear %in% c(3, 5) ) %>% 
   spread(gear, newvar) %>% 
   transmute(newvar = `3` - `5`)
# A tibble: 3 x 2
# Groups:   cyl [3]
#    cyl newvar
#  <dbl>  <dbl>
#1     4  -1.19
#2     6   3.90
#3     8  42.5 
0 голосов
/ 27 августа 2018

Ваш пример кода в основном там.Вы можете сделать:

df1 %>% 
    mutate(Diff = newvar[gear == "3"] - newvar[gear == "5"])

Или:

df1 %>% 
    summarise(Diff = newvar[gear == "3"] - newvar[gear == "5"])

Логическое подмножество все еще работает в mutate() и summarise() вызовах, как и в любом другом векторе.

Примечаниеэто работает, потому что после вашего вызова summarise() в вашем примере кода, df1 все еще группируется по cyl, в противном случае вам потребуется выполнить вызов group_by(), чтобы создать правильную группировку.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...