Нечто подобное будет работать на вашем примере (я добавил местоположение в фрейм данных):
library(tidyverse)
Gender1 <- c("M","F")
Gender2 <- c("F", "M")
Work1 <- c("A", "B")
Work2 <- c("B","A")
RevenueA <- c(10,20)
RevenueB <- c(20,10)
Location <- c("ABC", "ABC")
df <- data.frame(Location, Gender1, Gender2, Work1, Work2, RevenueA, RevenueB)
df %>%
gather(key_gen, value_gen, which(grepl("Gender", colnames(.)))) %>%
gather(key_work, value_work, which(grepl("Work", colnames(.)))) %>%
gather(key_reven, value_reven, which(grepl("Revenue", colnames(.)))) %>%
mutate(
gen_id = gsub(".*(\\d+$)", "\\1", key_gen),
work_id = gsub(".*(\\d+$)", "\\1", key_work),
reven_id = gsub("Revenue", "", key_reven),
key_work = "Work", key_gen = "Gender", key_reven = "Revenue"
) %>%
filter(gen_id == work_id & value_work == reven_id) %>%
select(-contains("_id"), -key_reven) %>%
add_count(value_gen, value_work) %>%
group_by(value_gen, value_work) %>%
mutate(
mean_reven = paste0("MeanRevenue", value_work),
mean_reven_n = mean(value_reven, na.rm = TRUE),
key_work = paste0(key_work, value_work)
) %>% ungroup() %>%
distinct(Location, key_gen, value_gen, key_work, n, mean_reven, mean_reven_n) %>%
spread(key_gen, value_gen) %>%
spread(key_work, n) %>%
spread(mean_reven, mean_reven_n) %>%
mutate_at(vars(contains("Work"), contains("MeanRevenue")), funs(replace(., is.na(.), 0)))
Выход:
Location Gender WorkA WorkB MeanRevenueA MeanRevenueB
<fct> <chr> <dbl> <dbl> <dbl> <dbl>
1 ABC F 0 2 0 15
2 ABC M 2 0 15 0
Однако я считаю, что ваши данные могут быть более сложными. Если это плохо масштабируется для вашего набора данных, было бы полезно, если бы вы предоставили нам более сложный пример, который лучше напоминает ваш исходный кадр данных.