Как я могу сосредоточиться на значении отдельной группы с group_by в dplyr? - PullRequest
0 голосов
/ 24 февраля 2020
> library(dplyr)
> mtcars %>%
+   add_rownames()%>% #if the rownames are needed as a column
+   group_by(cyl) %>% 
+   mutate(cent= mpg-mean(mpg))%>%
+   dplyr ::select(cent)
Adding missing grouping variables: `cyl`
# A tibble: 32 x 2
# Groups:   cyl [3]
     cyl   cent
   <dbl>  <dbl>
 1     6  0.909
 2     6  0.909
 3     4  2.71 
 4     6  1.31 
 5     8 -1.39 
 6     6 -1.99 
 7     8 -5.79 
 8     4  4.31 
 9     4  2.71 
10     6 -0.891
# … with 22 more rows
Warning message:
Deprecated, use tibble::rownames_to_column() instead. 
> mtcars$mpg[1:5]-mean(mtcars$mpg)
[1]  0.909375  0.909375  2.709375  1.309375 -1.390625

Я намерен центрировать миль на галлон на среднем уровне группы (то есть средние значения различны для разных групп цилиндров), но выше кода, центрированного на среднем значении.

Ответы [ 4 ]

1 голос
/ 24 февраля 2020

Ваш код работает просто отлично (или, по крайней мере, он делает то, что вы думаете:

library(dplyr)
mtcars %>%
  group_by(cyl) %>% 
    mutate(Mean= mean(mpg))%>%
    dplyr ::select(Mean)

Возвращает:

      cyl  Mean
    <dbl> <dbl>
  1     6  19.7
  2     6  19.7
  3     4  26.7
  4     6  19.7
  5     8  15.1
  6     6  19.7
  7     8  15.1
  8     4  26.7
  9     4  26.7
 10     6  19.7
0 голосов
/ 24 февраля 2020

А как насчет использования scale?

mtcars %>% 
    group_by(cyl) %>% 
    mutate(cent = scale(mpg, scale = F)) %>% 
    mutate(mean = mean(mpg)) %>% 
    select(cyl, cent, mean) 

Обязательно укажите scale = F, иначе он будет стандартизирован как будет. Это дает:

# A tibble: 32 x 3
# Groups:   cyl [3]
     cyl   cent  mean
   <dbl>  <dbl> <dbl>
 1     6  1.26   19.7
 2     6  1.26   19.7
 3     4 -3.86   26.7
 4     6  1.66   19.7
 5     8  3.6    15.1
 6     6 -1.64   19.7
 7     8 -0.800  15.1
 8     4 -2.26   26.7
 9     4 -3.86   26.7
10     6 -0.543  19.7
# ... with 22 more rows 
0 голосов
/ 24 февраля 2020

Странно, что когда я добавляю префикс dplyr ::, все идет хорошо;

> mtcars %>%
+   dplyr::group_by(cyl) %>% 
+   dplyr::mutate(mean= mean(mpg))%>%
+   dplyr::select(mpg,mean)
Adding missing grouping variables: `cyl`
# A tibble: 32 x 3
# Groups:   cyl [3]
     cyl   mpg  mean
   <dbl> <dbl> <dbl>
 1     6  21    19.7
 2     6  21    19.7
 3     4  22.8  26.7
 4     6  21.4  19.7
 5     8  18.7  15.1
 6     6  18.1  19.7
 7     8  14.3  15.1
 8     4  24.4  26.7
 9     4  22.8  26.7
10     6  19.2  19.7
# … with 22 more rows
> mtcars %>%
+   group_by(cyl) %>% 
+   mutate(mean= mean(mpg))%>%
+   dplyr::select(mpg,mean)
Adding missing grouping variables: `cyl`
# A tibble: 32 x 3
# Groups:   cyl [3]
     cyl   mpg  mean
 * <dbl> <dbl> <dbl>
 1     6  21    20.1
 2     6  21    20.1
 3     4  22.8  20.1
 4     6  21.4  20.1
 5     8  18.7  20.1
 6     6  18.1  20.1
 7     8  14.3  20.1
 8     4  24.4  20.1
 9     4  22.8  20.1
10     6  19.2  20.1
# … with 22 more rows
0 голосов
/ 24 февраля 2020
> mtcars %>%
+   add_rownames()%>% #if the rownames are needed as a column
+   group_by(cyl) %>% 
+   mutate(cent= mpg-mean(mpg),
+          mean= mean(mpg))%>%
+   dplyr ::select(mpg,mean,cent)
Adding missing grouping variables: `cyl`
# A tibble: 32 x 4
# Groups:   cyl [3]
     cyl   mpg  mean   cent
   <dbl> <dbl> <dbl>  <dbl>
 1     6  21    20.1  0.909
 2     6  21    20.1  0.909
 3     4  22.8  20.1  2.71 
 4     6  21.4  20.1  1.31 
 5     8  18.7  20.1 -1.39 
 6     6  18.1  20.1 -1.99 
 7     8  14.3  20.1 -5.79 
 8     4  24.4  20.1  4.31 
 9     4  22.8  20.1  2.71 
10     6  19.2  20.1 -0.891
...