Один из вариантов - сгруппировать по «group», затем перебрать unique
«employee», найти строки «customer_service_score», где «employee» не является уникальным «employee», и применить net_promoter_score
library(tidyverse)
df %>%
group_by(group) %>%
summarise(score = list(map(unique(employee), ~
tibble(employee_excluded = .x,
score = net_promoter_score(customer_service_score[employee != .x]))))) %>%
unnest %>%
unnest
# A tibble: 8 x 3
# group employee_excluded score
# <fct> <fct> <dbl>
#1 A Amy 58.1
#2 A Vera 46.2
#3 A Bruce 59.1
#4 A John 45.2
#5 B Vera 22.2
#6 B Bruce 26.5
#7 B John 37.8
#8 B Amy 45.9
Или используя data.table
library(data.table)
setDT(df)[, .(employee_excluded = unique(employee),
score = unlist(lapply(unique(employee),
function(x) net_promoter_score(customer_service_score[employee != x])))),
group]
Если мы используем измененную функцию
net_promoter_score <- function(d,col_name) {
((sum(d[[col_name]]>=9,na.rm=TRUE)-
sum(d[[col_name]]<=6,na.rm=TRUE))/sum(!is.na(d[[col_name]]))*100)
}
, тогда мы можемизменить код
df %>%
group_by(group) %>%
nest %>%
mutate(data = map(data, ~
.x %>%
distinct(employee) %>%
pull(employee) %>%
map_df(function(x)
.x %>%
filter(employee != x) %>%
summarise(employee_excluded = x,
score = net_promoter_score(.,
"customer_service_score"))) )) %>%
unnest
# A tibble: 8 x 3
# group employee_excluded score
# <fct> <fct> <dbl>
#1 A Amy 58.1
#2 A Vera 46.2
#3 A Bruce 59.1
#4 A John 45.2
#5 B Vera 22.2
#6 B Bruce 26.5
#7 B John 37.8
#8 B Amy 45.9