【问题标题】:Calculate various means from data based on values根据值从数据中计算各种均值
【发布时间】:2016-02-22 21:04:12
【问题描述】:

我有一个包含团队成员评分的大型电子表格,我想从中计算人们对自己的评价、团队中其他人对他们的评价以及他们对团队中其他人的评价(所有平均值)。我一直在尝试使用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。评分者 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

如果您能对这些部分提供帮助,我将不胜感激!

【问题讨论】:

    标签: r dplyr


    【解决方案1】:

    我建议首先使用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
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多