我需要将几行添加到一起,因为它们与另一行有共同点

I need to add several rows together based on the fact that they have something in common with another row

我需要使用手头的信息来预测下个月我们需要多少特定产品。我有几个月的数据可以回溯,但是数据被 VPN 和一个单独的仓库编号分开。我只需要知道一般订购多少而忽略仓库分离。我们稍后会添加回来。

许多 VPN 有多个重复项,我想合并所有重复项并对分开的数字求和。

 VPN         Month To Date December November October September August July June  May April March

0A36227-AA            15        6        4       2        NA      4    6    4    2  <NA>     4
0A36227-AA            NA        1       NA      NA        NA     NA    1 <NA> <NA>  <NA>  <NA>
0A36227-AA             2        3        1      NA         2      3    3    1 <NA>     2     3
0A36258-AA            NA       NA       NA       1        NA     NA <NA> <NA>    1  <NA>  <NA>
0A36258-AA             1       NA        1      NA        NA     NA <NA>    1 <NA>  <NA>  <NA>
0A36258-AA            NA       NA       NA       1        NA     NA <NA> <NA>    1  <NA>  <NA>
0A36258-AA             1       NA       NA      NA        NA     NA <NA> <NA> <NA>  <NA>  <NA>

所以我想合并所有重复项并将行中的所有数字添加到每个 VPN 的一行中。

我试过使用聚合函数,但它对我不起作用。不过我可能用错了。

如有任何帮助,我们将不胜感激!

在某些情况下,它可能会导致出现无限数量。如果有人对如何处理有任何进一步的建议,我们将不胜感激。

您基本上想知道如何在数据框中分组时执行求和。 你会找到很多答案。 我有一个 data.table 解决方案来解决你的问题:

plouf <- read.table(text = "   VPN  Month.To.Date December November October September August July June  May April March

                       0A36227-AA            15        6        4       2        NA      4    6    4    2  <NA>     4
                       0A36227-AA            NA        1       NA      NA        NA     NA    1 <NA> <NA>  <NA>  <NA>
                       0A36227-AA             2        3        1      NA         2      3    3    1 <NA>     2     3
                       0A36258-AA            NA       NA       NA       1        NA     NA <NA> <NA>    1  <NA>  <NA>
                       0A36258-AA             1       NA        1      NA        NA     NA <NA>    1 <NA>  <NA>  <NA>
                       0A36258-AA            NA       NA       NA       1        NA     NA <NA> <NA>    1  <NA>  <NA>
                       0A36258-AA             1       NA       NA      NA        NA     NA <NA> <NA> <NA>  <NA>  <NA>",
                    stringsAsFactors = FALSE, header = TRUE)

这是代码

DT <- setDT(plouf)
tochange <- names(DT)[!names(DT) %in% "VPN"]

这里的 tochange 向量是您要平均的列的列表

DT[,c(tochange) := lapply(.SD,function(x){as.numeric(x)}),.SDcols = tochange]
DT[,lapply(.SD,function(x){sum(x,na.rm = TRUE)}),.SDcols = tochange,by = VPN]

第一行是将所有内容设置为数字¨

第二行忽略 NA 并按 VPN 分组执行求和。我不是 100% 确定那是你想要的。

          VPN Month.To.Date December November October September August July June May April March  i
1: 0A36227-AA            17       10        5       2         2      7   10    5   2     2     7 10
2: 0A36258-AA             2        0        1       2         0      0    0    1   2     0     0  0

希望对你有帮助

这里是 dplyr 等价物

plouf %>%
  mutate_at(vars(tochange),funs(as.numeric)) %>%
  group_by(VPN) %>%
  summarise_at(vars(tochange),funs(sum(.,na.rm = TRUE)))