Вычислите разницу между средними значениями в парных данных в R - PullRequest
2 голосов
/ 30 мая 2020

У меня есть фрейм данных, как показано ниже:

df <- data.frame(Staff = c("Jack", "Ruth", "Michael", "Ruth", "Jack", "Jack", "Ruth", "Michael"), 
                 Client = c("Julie", "Julie", "Julie", "Julie", "Julie", "Candice", "Candice", "Candice"),
                 Assessment = c(1, 2, 2, 1, 7, 4, 1, 1), 
                 Staff_avg_by_client = c(4, 1.5, 2, 1.5, 4, 4, 1, 1))

Мне нужен столбец, в котором вычисляется разница между средним значением оценок одного сотрудника и средним значением оценок всех остальных сотрудников.

Ответы [ 2 ]

2 голосов
/ 30 мая 2020

Для каждого Client мы можем вычесть Staff_avg_by_client на mean из Assessment для всех остальных Staff. Используя dplyr, это можно сделать как:

library(dplyr)
library(purrr)

df %>%
  group_by(Client) %>%
  mutate(diff = map_dbl(row_number(), 
              ~Staff_avg_by_client[.x] - mean(Assessment[Staff != Staff[.x]])))

# Month Staff   Client  Assessment Staff_avg_by_client  diff
#  <dbl> <chr>   <chr>        <dbl>               <dbl> <dbl>
#1     1 Jack    Julie            1                 4    2.33
#2     1 Ruth    Julie            2                 1.5 -1.83
#3     1 Michael Julie            2                 2   -0.75
#4     1 Ruth    Julie            1                 1.5 -1.83
#5     1 Jack    Julie            7                 4    2.33
#6     1 Jack    Candice          4                 4    3   
#7     1 Ruth    Candice          1                 1   -1.5 
#8     1 Michael Candice          1                 1   -1.5 
1 голос
/ 30 мая 2020

Вот подход с data.table (раз уж это то, что вы просили):

Мы можем использовать by = seq(1,nrow(df)) для работы с каждой строкой.

Затем для каждой строки мы можем подмножество df с помощью Staff и Client этой строки, используя специальный символ .SD. Итак, для строки 1, .SD[,Staff] оценивается как "Jack", а .SD[,Client] оценивается как "Julie".

library(data.table)
setDT(df)
df[, Diff := Staff_avg_by_client -
     df[Staff != .SD[,Staff] & Client == .SD[,Client], mean(Assessment)],
   by = seq(1,nrow(df))][]
   Month   Staff  Client Assessment Staff_avg_by_client      Diff
1:     1    Jack   Julie          1                 4.0  2.333333
2:     1    Ruth   Julie          2                 1.5 -1.833333
3:     1 Michael   Julie          2                 2.0 -0.750000
4:     1    Ruth   Julie          1                 1.5 -1.833333
5:     1    Jack   Julie          7                 4.0  2.333333
6:     1    Jack Candice          4                 4.0  3.000000
7:     1    Ruth Candice          1                 1.0 -1.500000
8:     1 Michael Candice          1                 1.0 -1.500000

Последний [] предназначен только для печати data.table после назначения по ссылке.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...