动态归一化组中第一个元素的所有行

时间:2018-09-30 19:37:06

标签: r dplyr tidyverse mutate

假设我具有以下数据框:

      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 :(得分:1)

我们将“主题”分组,并使用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