Динамически нормализовать все строки с первым элементом в группе - PullRequest
0 голосов
/ 30 сентября 2018

Предположим, у меня есть следующий фрейм данных:

      year subject grade study_time
1    1       a    30         20
2    2       a    60         60
3    1       b    30         10
4    2       b    90        100

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

df %>% 
  group_by(subject) %>%
  mutate(RN = row_number()) %>% 
  mutate(study_time = study_time/study_time[RN ==1], 
          grade = grade/grade[RN==1]) %>%
 select(-RN)

Я бы получил следующий вывод

      year subject grade study_time
1    1       a    1         1
2    2       a    2         3
3    1       b    1         1
4    2       b    3        10

Это довольно легко сделать, когда я знаю, что такое имена переменных.Тем не менее, я пытаюсь написать обобщающую функцию, которая могла бы действовать на любой data.frame / data.table / tibble, где я могу не знать имя переменных, которые мне нужно изменить, я буду знать толькоимена переменных не должны изменяться.Я пытаюсь сделать это с помощью tidyverse / data.table и не могу заставить что-либо работать.

Любая помощь будет принята с благодарностью.

1 Ответ

0 голосов
/ 30 сентября 2018

Мы группируем по «теме» и используем mutate_at, чтобы изменить несколько столбцов, разделив элемент на first элемент

library(dplyr)
df %>%
   group_by(subject) %>%
   mutate_at(3:4, funs(./first(.)))
# A tibble: 4 x 4
# Groups:   subject [2]
#   year subject grade study_time
#  <int> <chr>   <dbl>      <dbl>
#1     1 a           1          1
#2     2 a           2          3
#3     1 b           1          1
#4     2 b           3         10
...