r - 在 R dplyr 中根据其他变量的唯一值对多个变量进行分组

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

valueC idB 的每个唯一值都是唯一的。 我想使用dplyr管道(因为我的其余代码位于 dplyr )并使用 group_bygrpA获得总和为 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然后mergeleft join 。但我正在寻找更好的内联解决方案。 如果之前已经回答过,请引用链接,因为我找不到此问题的任何相关答案。

最佳答案

我们需要uniquematch

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/

相关文章:

r - 日期上的嵌套 If 语句

r - 如何使用 dplyr 计算每列中的零?

r - 带条件的 sum() 在 dplyr 包中提供了不正确的结果

R:如何在集团层面重新采样日内数据?

r - 在R中对大型矩阵的每一行进行排序的最快方法

r - 分别为带状图中的每个数据点定义颜色

r - dplyr:当我需要所有变量名称时如何避免硬编码变量名称?

SQL - 如何按 id 进行分组并识别具有最高值的列?

pandas - 如何在matplotlib pandas中将两个文件的两个条形图组合在一张图中

python - Pandas:匿名 client_id 列,无法回滚