根据值从数据中计算各种均值

时间:2016-02-22 21:04:12

标签: r dplyr

我有一个大型的团队成员评级电子表格,我想从中计算出人们如何评价自己,团队中其他人如何评价他们,以及他们如何评价团队中的其他人(所有平均值)。我一直在尝试使用dplyr执行此操作,因为我之前使用过它,我认为group_by会在进行这些计算时简化操作。我无法弄清楚所以我正在寻求帮助。我会试着解释一下我的想法。

以下是一个示例数据集:

data <- read.table(text="
Team    Rater   A1  B1  C1  A2  B2  C2  A3  B3  C3  A4  B4  C4  A5  B5  C5  A6  B6  C6
1   1   2   4   4   2   1   5   2   2   3   4   4   4   3   2   1   NA  NA  NA
1   2   4   5   4   4   5   1   1   1   5   5   3   1   4   5   2   NA  NA  NA
1   3   2   1   4   3   5   5   2   1   5   1   1   4   1   1   4   NA  NA  NA
1   4   4   3   4   3   5   1   3   1   3   5   5   5   5   2   2   NA  NA  NA
1   5   3   4   5   4   3   3   5   5   4   1   4   5   5   5   1   NA  NA  NA
2   1   3   5   3   4   1   1   3   4   3   4   3   2   2   2   3   3   5   3
2   2   3   2   3   1   1   3   5   5   1   5   2   3   2   2   1   3   3   2
2   3   3   2   3   3   5   2   4   1   1   1   4   5   3   5   2   1   1   3
2   4   3   3   5   4   3   5   3   1   4   3   1   1   4   2   4   3   5   2
2   5   5   2   1   2   5   5   3   3   1   4   1   5   5   3   3   4   2   5
2   6   3   2   3   5   4   3   2   1   5   4   3   1   1   1   4   2   2   1",header = TRUE)

每个评估者为每个其他团队成员提供多个问题的输入。它的组织方式,评估者1回答关于他们自己的A1,B1和C1。 Rater 2回答关于他们自己的A2,B2和C2,依此类推。

自我评级

为了得到某人对自己的评价,我认为它会是这样的:

data %>%
  group_by(Team) %>%
  mutate(self = rowMeans(select(.,ends_with(Rater)), na.rm = TRUE))

如果列选择动态地基于其评估者编号,则会很方便。

来自其他人

我在考虑根据该人的平均总体评分来计算这个数,除了自我评价:

data %>%
  group_by(Team) %>%
  mutate(from = ( (mean(ends_with(Rater)) * n() - self ) / ( n() - 1 ) ) )

其他人

对于这个列计算,我正在考虑以下几点:

data %>%
  mutate(of = select(A1:C6, -(ends_with(Rater))) %>% rowMeans(na.rm = TRUE))

(类似于此answer

结果

以下是我正在寻找新列的示例:

Team    Rater   self    from    of
1   1   3.33    3.58    2.75
1   2   3.33    3.33    3.33
1   3   2.67    2.92    2.67
1   4   5.00    3.08    3.00
1   5   3.67    2.67    3.83

如果您可以帮助我们,我会很感激!

1 个答案:

答案 0 :(得分:3)

我建议首先将您的数据转换为“整洁”格式tidyr,例如

library(tidyr)
tidy <- data %>% gather(QV,Rating,-Team,-Rater) %>%
    separate(QV, into=c("Quest","Rated"), sep=1) %>%
    mutate(Rated=as.numeric(Rated)) %>%
    filter(!is.na(Rating))

这会将您的数据转换为具有以下形状

  Team Rater Quest Rated Rating
1    1     1     A     1      2
2    1     2     A     1      4
3    1     3     A     1      2
4    1     4     A     1      4
5    1     5     A     1      3
6    2     1     A     1      3
...

因此我们将您的数据转换为长格式。然后,您可以更直接地执行每个查询并将它们合并在一起

Reduce(left_join, list(
  tidy %>% group_by(Team, Rater) %>% filter(Rated==Rater) %>% summarize(self=mean(Rating)),
  tidy %>% group_by(Team, Rated) %>% filter(Rated!=Rater) %>% summarize(others=mean(Rating)) %>% rename(Rater=Rated),
  tidy %>% group_by(Team, Rater) %>% filter(Rated!=Rater) %>% summarize(of=mean(Rating))
))

返回

    Team Rater     self   others       of
   (int) (dbl)    (dbl)    (dbl)    (dbl)
1      1     1 3.333333 3.583333 2.750000
2      1     2 3.333333 3.333333 3.333333
3      1     3 2.666667 2.916667 2.666667
4      1     4 5.000000 3.083333 3.000000
5      1     5 3.666667 2.666667 3.833333
6      2     1 3.666667 2.866667 2.866667
7      2     2 1.666667 3.466667 2.800000
8      2     3 2.000000 2.933333 2.866667
9      2     4 1.666667 3.133333 3.400000
10     2     5 3.666667 2.533333 3.200000
11     2     6 1.666667 3.000000 2.800000