在R dplyr中为另一个变量

时间:2017-10-25 01:40:53

标签: r group-by dplyr

我有一个包含三列的数据集,如下所示:

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)
)

valueCidB的每个唯一值都是唯一的。 我想使用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。但我正在寻找更好的内联解决方案。 如果之前已经回答,请转到我的链接,因为我找不到任何相关的答案。

1 个答案:

答案 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