当其他列的对应值重复时,我想添加一列的值 R

I want to add the values of a column when the corresponding values of other columns are duplicates R

我有一个类似的问题:()但是这个解决方案对我不起作用或者我不知道如何修改它。

如果 Reference 和 NODCCODE 匹配,我需要将 Number 列值加在一起,即使 NODCCODE 在 Reference number 中不相邻。

我有这个:

structure(list(Reference = c("BBM101", "BBM102", 
                             "BBM102", "BBM102", "BBM103", "BBM103", 
                             "BBM104", "BBM105", "BBM105", "BBM105"), 
               NODCCODE = c("101","301", "201", "201", "201", "401", "401", "201", "102", "201"), 
               Number = c(2, 1, 3, 1, 3, 14, 3, 24, 2, 1)), 
          row.names = c(NA, 10L), class = "data.frame")
   Reference NODCCODE Number
1     BBM101      101      2
2     BBM102      301      1
3     BBM102      201      3
4     BBM102      201      1
5     BBM103      201      3
6     BBM103      401     14
7     BBM104      401      3
8     BBM105      201     24
9     BBM105      102      2
10    BBM105      201      1

我想要这个:

structure(list(Reference = c("BBM101", "BBM102", "BBM102", "BBM103", "BBM103", "BBM104", "BBM105", "BBM105"), 
               NODCCODE = c("101","301", "201", "201", "401", "401", "201", "102"), 
               Number = c(2, 1, 4, 3, 14, 3, 25, 2)), 
          row.names = c(NA, 8L), class = "data.frame")
Reference NODCCODE Number
1    BBM101      101      2
2    BBM102      301      1
3    BBM102      201      4
4    BBM103      201      3
5    BBM103      401     14
6    BBM104      401      3
7    BBM105      201     25
8    BBM105      102      2

请注意第 3 行和第 4 行 Reference 和 NODCCODE 已合并,并添加了 Number 列。还有第 8 行和第 10 行,即使在 201 个值之间有一个 102 值,它们都具有相同的参考编号,因此添加了它们。我不关心剩下的行是在那组参考数字的开头还是结尾。

相信这么简单用tidyverse? Reference 只有一个匹配的 NODCCODE 的总和将是唯一值,具有相同 reference 和 NODCCODE 的条目将被求和

library(tidyverse)

struct <- structure(list(Reference = c("BBM101", "BBM102", 
                             "BBM102", "BBM102", "BBM103", "BBM103", 
                             "BBM104", "BBM105", "BBM105", "BBM105"), 
               NODCCODE = c("101","301", "201", "201", "201", "401", "401", "201", "102", "201"), 
               Number = c(2, 1, 3, 1, 3, 14, 3, 24, 2, 1)), 
          row.names = c(NA, 10L), class = "data.frame")


result <- struct %>% 
  group_by(Reference,NODCCODE) %>% 
  summarise(Number = sum(Number)) %>% 
  arrange(Reference) %>% 
  ungroup()

result
#> # A tibble: 8 x 3
#>   Reference NODCCODE Number
#>   <chr>     <chr>     <dbl>
#> 1 BBM101    101           2
#> 2 BBM102    201           4
#> 3 BBM102    301           1
#> 4 BBM103    201           3
#> 5 BBM103    401          14
#> 6 BBM104    401           3
#> 7 BBM105    102           2
#> 8 BBM105    201          25

reprex package (v0.3.0)

于 2020-04-24 创建

如果您加载 data.table 包,将您的 data.frame 转换为 data.table(使用 setDT),您可以这样做

unique(dt1[, Number := sum(Number), by = c("Reference", "NODCCODE")])

这里使用 dt[i, j, by] 表示法,将数字的总和重新分配给数字,该函数由引用和 NODCCODE 的唯一组合完成,并将其包装在 unqiue() 函数中以获得独特的行。