假设我有以下数据框:
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/