如何根据唯一项目ID对列中的项目值进行求和?

时间:2017-04-27 21:26:53

标签: r dataframe dplyr

为了描述我的问题,我创建了一个简化的数据框,如下所示:

df_test <- data.frame(
  proj_manager = c('Emma','Emma','Emma','Emma','Emma','Alice','Alice'),
  proj_ID = c(1, 1, 2, 2, 2, 3, 4), 
  stage = c('B','B','B','B','B','A','C'),
  value = c(15,15,20,20,20,70,5)
)

我需要对列进行一些计算以准备即可。我创建了一个新列,根据项目经理和项目阶段计算项目。我做了:

input <- df_test %>%
  group_by(proj_manager, stage) %>%
  mutate(count_proj = length(unique(proj_ID)))

现在数据框如下所示:

proj_manager proj_ID  stage value count_proj
    <fctr>   <dbl> <fctr> <dbl>      <int>
1         Emma       1      B    15          2
2         Emma       1      B    15          2
3         Emma       2      B    20          2
4         Emma       2      B    20          2
5         Emma       2      B    20          2
6        Alice       3      A    70          1
7        Alice       3      C     5          1

我想创建另一个名为&#39; sum_value&#39;的列。根据同一阶段计算项目的总和值,但只计算不同的项目。例如,艾玛有&#39; proj_ID 1&#39;和&#39; proj_ID 2&#39;在阶段B,然后新列将总和proj 1和proj 2的值.mutate(sum_value = sum(unique(value)))将为这个简化的数据集提供技巧,但是当两个不同的项目遇到相同的值时,这会导致错误。

所需的输出如下所示:

proj_manager proj_ID  stage value count_proj sum_value
        <fctr>   <dbl> <fctr> <dbl>      <int>     <dbl>
1         Emma       1      B    15          2        35
2         Emma       1      B    15          2        35
3         Emma       2      B    20          2        35
4         Emma       2      B    20          2        35
5         Emma       2      B    20          2        35
6        Alice       3      A    70          1        70
7        Alice       3      C     5          1         5

有什么好主意吗?

2 个答案:

答案 0 :(得分:3)

一个选项使用group_by %>% do;在do内,您可以使用distinct为每个项目获取唯一值,并sum结果:

df_test %>% 
    group_by(proj_manager, stage) %>% 
    do({
        sum_value = sum(distinct(., proj_ID, value)$value);
        mutate(., sum_value = sum_value)
    })

#Source: local data frame [7 x 5]
#Groups: proj_manager, stage [3]

#  proj_manager proj_ID  stage value sum_value
#        <fctr>   <dbl> <fctr> <dbl>     <dbl>
#1        Alice       3      A    70        70
#2        Alice       4      C     5         5
#3         Emma       1      B    15        35
#4         Emma       1      B    15        35
#5         Emma       2      B    20        35
#6         Emma       2      B    20        35
#7         Emma       2      B    20        35

答案 1 :(得分:1)

这种方法是分别计算总数,然后使用inner_join加入给定的表

totals <- df_test %>%
  distinct(proj_ID, stage, value) %>%
  group_by(stage) %>%
  summarize(sum_value1 = sum(value))

input <- df_test %>%
  group_by(proj_manager, stage) %>%
  mutate(count_proj = length(unique(proj_ID)))  %>%
  inner_join(totals, by="stage")


input
#   proj_manager proj_ID  stage value count_proj sum_value1
# 1         Emma       1      B    15          2         35
# 2         Emma       1      B    15          2         35
# 3         Emma       2      B    20          2         35
# 4         Emma       2      B    20          2         35
# 5         Emma       2      B    20          2         35
# 6        Alice       3      A    70          1         70
# 7        Alice       4      C     5          1          5