Это можно сделать с помощью первого spread
этого в «широкий» формат, получить отношения, gather
в «длинный» формат и spread
обратно в «широкий» формат
library(tidyverse)
df %>%
spread(label, value) %>%
transmute(element,
begin_to_sessions = begin/sessions,
complete_to_sessions = complete/sessions) %>%
gather(label_2, val, -element) %>%
spread(element, val)
Или используя mutate_at
(в случае, если имеется много столбцов)
df %>%
spread(label, value) %>%
mutate_at(vars(begin, complete), list(~ ./sessions)) %>%
select(-sessions) %>%
rename_at(vars(begin, complete), ~ paste0(., "_to_sessions")) %>%
gather(label_2, val, -element) %>%
spread(element, val)
# A tibble: 2 x 3
# label_2 aa bb
# <chr> <dbl> <dbl>
#1 begin_to_sessions 0.301 0.142
#2 complete_to_sessions 0.0255 0.00578
Мы также можем избежать многократного gather/spread
, выполнив деление group_by
, извлекая соответствующее значениев строку 'session' в 'label', filter
выводим строки, содержащие 'session' в 'label', а затем делаем один spread
в конце
df %>%
group_by(element) %>%
mutate(value = value/value[label == "sessions"]) %>%
ungroup %>%
filter(label != "sessions") %>%
transmute(element, value, label2 = paste0(label, "_to_sessions")) %>%
spread(element, value)