我有一个包含三列的数据集,如下所示:
data <- data.frame(
grpA = c(1,1,1,1,1,2,2,2),
idB = c(1,1,2,2,3,4,5,6),
valueC = c(10,10,20,20,10,30,40,50),
otherD = c(1,2,3,4,5,6,7,8)
)
valueC
对idB
的每个唯一值都是唯一的。
我想使用dplyr
管道(因为我的其余代码位于dplyr
中)并使用group_by
上的grpA
来获取总和为valueC
的新列每个组的值。
答案应该是:
newCol <- c(40,40,40,40,40,120,120,120)
但是data %>% group_by(grpA) %>%
mutate(newCol=sum(valueC)
,我得到newCol <- c(70,70,70,70,70,120,120,120)
如何添加idB
的唯一值?我还可以使用group_by
管道中的dplyr %>%
代替其他内容吗?
我无法使用summarise
,因为我需要保留otherD
中的值,以备日后使用。
我的其他选项是通过newCol
分别创建sql
,然后merge
创建left join
。但我正在寻找更好的内联解决方案。
如果之前已经回答,请转到我的链接,因为我找不到任何相关的答案。
答案 0 :(得分:2)
unique
match
data %>%
group_by(grpA) %>%
mutate(ind = sum(valueC[match(unique(idB), idB)]))
# A tibble: 8 x 5
# Groups: grpA [2]
# grpA idB valueC otherD ind
# <dbl> <dbl> <dbl> <dbl> <dbl>
#1 1 1 10 1 40
#2 1 1 10 2 40
#3 1 2 20 3 40
#4 1 2 20 4 40
#5 1 3 10 5 40
#6 2 4 30 6 120
#7 2 5 40 7 120
#8 2 6 50 8 120
或者另一种选择是通过&#39; grpA&#39;&#39; idB&#39;获取distinct
行,按&#39; grpA&#39;分组,获取{{ 1&quot;&#39; valueC&#39;和sum
原始数据
left_join