Я хочу изменить масштаб всех переменных (кроме year
и gender
) в df
на одну конкретную year
, сгруппированную по gender
:
set.seed(1)
df <- data.frame(gender = c(rep("m", 5), rep("f", 5)), year = rep(1:5, 2), var_a = 1:10, var_b = 0:9)
df
gender year var_a var_b
1 m 1 1 0
2 m 2 2 1
3 m 3 3 2
4 m 4 4 3
5 m 5 5 4
6 f 1 6 5
7 f 2 7 6
8 f 3 8 7
9 f 4 9 8
10 f 5 10 9
Я могу сгенерировать то, что ожидаю, используя:
df %>% group_by(gender) %>% mutate(var_a = ifelse(year == 3, 0, var_a - var_a[year == 3])) %>%
mutate(var_b = ifelse(year == 3, 0, var_b - var_b[year == 3]))
gender year var_a var_b
<fct> <int> <dbl> <dbl>
1 m 1 -2 -2
2 m 2 -1 -1
3 m 3 0 0
4 m 4 1 1
5 m 5 2 2
6 f 1 -2 -2
7 f 2 -1 -1
8 f 3 0 0
9 f 4 1 1
10 f 5 2 2
Однако это не вариант, поскольку у меня слишком много столбцов.
Итак, я попытался (но безуспешно):
df %>% group_by(gender) %>% mutate_at(vars(-gender, -year), ifelse(year == 3, 0, var_a - var_a[year == 3]))
Ошибка в ifelse (год == 3, 0, var_a - var_a [год == 3]): объект
'год' не найден
Как я могу исключить имена столбцов в mutate_at
(или альтернативный вариант), используя vars(-col_name)
, продолжая читать данные в этих столбцах?
Это относится к этому