У меня есть фрейм данных (тиббл) с несколькими столбцами, и для каждого столбца после первых двух я хотел бы сохранить абсолютное значение, но также вставить значение относительно второго столбца. Например, я начинаю со следующего фрейма данных (имена столбцов могут отличаться!):
df = tibble(val1 = 5:10, val2 = 10:15, val3 = 15:20); df
# A tibble: 6 x 3
val1 val2 val3
<int> <int> <int>
1 5 10 15
2 6 11 16
3 7 12 17
4 8 13 18
5 9 14 19
6 10 15 20
Теперь для столбцов val2
и val3
я также хочу вставить столбец сразу после val2
и после val3
, показывающий значение относительно val1
. Как мне это сделать???
Полученный тиббл должен выглядеть так:
dfrel = tibble(val1 = 5:10, val2 = 10:15, rel2 = val2/val1, val3 = 15:20, rel3 = val3/val1)
dfrel
# A tibble: 6 x 5
val1 val2 rel2 val3 rel3
<int> <int> <dbl> <int> <dbl>
1 5 10 2.00 15 3.00
2 6 11 1.83 16 2.67
3 7 12 1.71 17 2.43
4 8 13 1.62 18 2.25
5 9 14 1.56 19 2.11
6 10 15 1.50 20 2.00
К сожалению, я не могу написать правильный вызов mutate_at для вставки этого относительного столбца сразу после каждого столбца значений. Фактически, я не могу написать mutate_at, используя funs (), который изменяет столбец, обращаясь к другим столбцам (по положению, а не по имени).
Замена val2 и val3 относительными значениями работает (с использованием лямбда-функции вместо funs), но не сохраняет исходные столбцы val2 и val3, как требуется:
df %>%
mutate_at(vars(-1), function(v) v/.[[1]])
# A tibble: 6 x 3
val1 val2 val3
<int> <dbl> <dbl>
1 5 2.00 3.00
2 6 1.83 2.67
3 7 1.71 2.43
4 8 1.62 2.25
5 9 1.56 2.11
6 10 1.50 2.00
Все мои попытки использовать funs()
терпят неудачу:
df %>%
mutate_at(vars(-1), funs(./.tbl[[1]]))
Error in mutate_impl(.data, dots) :
Evaluation error: object '.tbl' not found.
df %>%
mutate_at(vars(-1), funs(function(v) v/.[[1]]))
Error in mutate_impl(.data, dots) :
Column `val2` is of unsupported type function
Одна сложность по сравнению с Использование функций нескольких столбцов в вызов dplyr mutate_at заключается в том, что у моего столбца val1 нет фиксированного имени (т.е. он не всегда называется val1
), поэтому я не могу использовать его по имени в аргументах funs. Другая сложность заключается в том, что тиббл создается на лету (с использованием множества операторов конвейера) и обычно не сохраняется в переменной, поэтому я не могу просто разделить на df [[1]] ...
Итак, каков правильный подход dplyr для вставки относительных столбцов (то есть процента от первого столбца) после каждого столбца?