r - 动态规范化组中第一个元素的所有行

标签 r tidyverse dplyr

假设我有以下数据框:

      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 来完成这项工作,但我什么也做不了。

如有任何帮助,我们将不胜感激。

最佳答案

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

关于r - 动态规范化组中第一个元素的所有行,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/52581469/

相关文章:

r - 将 R 中 data.frame 的名称提取为字符

每个人重复一个模型 100 次

r - 如何最好地将 NA 的两个因素合并为一个变量

r - 从单独的列表创建嵌套的 data.frame

r - 使用 pmap 遍历 tibble 的行

r - 如何在R中旋转包含带有部分和子部分的列的数据框

r - 使用双矩阵查找填充数据框中的新列

r - 添加重复序列的分组指示符

R: (un)reduce 数据框

使用 dplyr (R) 根据查找表重新编码值