【问题标题】:I need to add several rows together based on the fact that they have something in common with another row我需要根据它们与另一行有共同点的事实将几行添加在一起
【发布时间】:2026-01-01 00:05:02
【问题描述】:

使用手头的信息,我需要预测下个月我们需要多少特定产品。我有几个月的数据可以回溯,但是数据由 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 的一行中。

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

任何帮助将不胜感激!

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

【问题讨论】:

  • 您能否请dput您的问题中的数据。

标签: r dplyr business-intelligence modeling


【解决方案1】:

您基本上想知道如何在数据框中进行分组时执行求和。 你会找到很多答案。 我为您的案例提供了一个 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)))

【讨论】:

    最近更新 更多