Нормализовать по группам для всех столбцов - PullRequest
0 голосов
/ 14 мая 2018

У меня есть набор данных с 400+ столбцами.Первые два столбца я хочу исключить в этом расчете, но я хочу включить его в свой окончательный вывод.

Для столбцов 3: ncol (df), как нормализовать по группе?

Это то, что у меня есть сейчас, но оно дало мне ошибку, и это заняло очень много времени в то же время:

library(BBmisc)
test<-df %>% 
group_by(group) %>% 
mutate_all(.vars = df[3:ncol(df)], 
           funs(normalize))

Я хочу иметь возможность установить диапазон отОт 0 до 5.

Вот так выглядит мой набор данных:

df
group    week    col3     col4    col5 ......
    A       1      25       56      87 ......
    A       2      21       34      98 ......
    A       3      34       67     100 ......
    B       1      11      120    1000 ......
    B       2       8      340    1200 ......
    B       3       2      560    2000 ......

Я хочу применить функцию нормализации из столбца 3 и далее (не жестко закодировано в столбец от col3 до col5, потому что у меня 400всего столбцов) по группе

1 Ответ

0 голосов
/ 14 мая 2018

Нам нужно mutate_at

df %>% 
  group_by(group) %>% 
  mutate_at(vars(-one_of("week")), normalize)
# A tibble: 6 x 5
# Groups:   group [2]
#  group  week   col3   col4   col5
#  <chr> <int>  <dbl>  <dbl>  <dbl>
#1 A         1 -0.250  0.218 -1.14 
#2 A         2 -0.851 -1.09   0.429
#3 A         3  1.10   0.873  0.714
#4 B         1  0.873 -1     -0.756
#5 B         2  0.218  0     -0.378
#6 B         3 -1.09   1      1.13 

Как уже упоминалось в комментариях, если мы используем диапазон индекса, то следует соблюдать осторожность с mutate_at.В настоящее время индексация начинается без столбца group_by.Итак, если мы хотим передать диапазон индекса, вычтите единицу из начальной и конечной позиций

df %>%
    group_by(group) %>%
    mutate_at(vars((3-1):(ncol(.)-1)), normalize)
# A tibble: 6 x 5
# Groups:   group [2]
#  group  week   col3   col4   col5
#  <chr> <int>  <dbl>  <dbl>  <dbl>
#1 A         1 -0.250  0.218 -1.14 
#2 A         2 -0.851 -1.09   0.429
#3 A         3  1.10   0.873  0.714
#4 B         1  0.873 -1     -0.756
#5 B         2  0.218  0     -0.378
#6 B         3 -1.09   1      1.13 

data

df <- structure(list(group = c("A", "A", "A", "B", "B", "B"), week = c(1L, 
2L, 3L, 1L, 2L, 3L), col3 = c(25L, 21L, 34L, 11L, 8L, 2L), col4 = c(56L, 
34L, 67L, 120L, 340L, 560L), col5 = c(87L, 98L, 100L, 1000L, 
1200L, 2000L)), class = "data.frame", row.names = c(NA, -6L))
...