我有一个包含三列的数据集,如下所示:
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
。但我正在寻找更好的内联解决方案。
如果之前已经回答过,请引用链接,因为我找不到此问题的任何相关答案。
最佳答案
我们需要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
或者另一种选择是获取 distinct
按“grpA”、“idB”的行,按“grpA”分组,得到sum
'valueC' 和 left_join
与原始数据
data %>%
distinct(grpA, idB, .keep_all = TRUE) %>%
group_by(grpA) %>%
summarise(newCol = sum(valueC)) %>%
left_join(data, ., by = 'grpA')
关于r - 在 R dplyr 中根据其他变量的唯一值对多个变量进行分组,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/46922599/