我需要根据它们与另一行有共同点的事实将几行添加到一起

时间:2018-01-09 17:47:57

标签: r dplyr business-intelligence modeling

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

所以我希望将所有重复项组合在一起,并将每行中的所有数字添加到每行一行中。

我已尝试使用聚合功能,但它对我没用。我可能用错了。

任何帮助将不胜感激!

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

1 个答案:

答案 0 :(得分:0)

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