为了描述我的问题,我创建了一个简化的数据框,如下所示:
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
有什么好主意吗?
答案 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