首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >汇总多个动态列并将结果存储在新列中

汇总多个动态列并将结果存储在新列中
EN

Stack Overflow用户
提问于 2018-04-28 16:46:50
回答 2查看 60关注 0票数 2

我有以下情况。

代码语言:javascript
复制
    df <- rbind(
  data.frame(thisDate = rep(seq(as.Date("2018-1-1"), as.Date("2018-1-2"), by="day")) ),
  data.frame(thisDate = rep(seq(as.Date("2018-2-1"), as.Date("2018-2-2"), by="day")) ))
df <- cbind(df,lastMonth = as.Date(format(as.Date(df$thisDate - months(1)),"%Y-%m-01")))
df <- cbind(df, prod1Quantity= seq(1:4) )

对于数量不明的产品,我有一个月的不同日子的数量。我希望每种产品都有一个列,其中包括上个月所有产品的每月总数量。所以输出应该是这样的。按lastMonth,Prod1Quantity分组。我只是不知道如何分组,变异和动态总结,如果这确实是正确的方法。

我偶然发现了data.table generate multiple columns and summarize them。我认为它似乎做了我需要的-但我只是不明白它是如何工作的!

期望输出

代码语言:javascript
复制
   thisDate  lastMonth prod1Quantity prod1prevMonth
1 2018-01-01 2017-12-01             1             NA
2 2018-01-02 2017-12-01             2             NA
3 2018-02-01 2018-01-01             3              3
4 2018-02-02 2018-01-01             4              3
EN

回答 2

Stack Overflow用户

回答已采纳

发布于 2018-04-28 18:34:50

另一种方法可能是

代码语言:javascript
复制
library(dplyr)
library(lubridate)

temp_df <- df %>%
  mutate(thisDate_forJoin = as.Date(format(thisDate,"%Y-%m-01"))) 

final_df <- temp_df %>%
  mutate(thisDate_forJoin = thisDate_forJoin %m-% months(1)) %>%
  left_join(temp_df %>%
              group_by(thisDate_forJoin) %>%
              summarise_if(is.numeric, sum), 
            by="thisDate_forJoin") %>%
  select(-thisDate_forJoin)

输出是:

代码语言:javascript
复制
    thisDate prod1Quantity.x prod2Quantity.x prod1Quantity.y prod2Quantity.y
1 2018-01-01               1              10              NA              NA
2 2018-01-02               2              11              NA              NA
3 2018-02-01               3              12               3              21
4 2018-02-02               4              13               3              21

样本数据:

代码语言:javascript
复制
df <- structure(list(thisDate = structure(c(17532, 17533, 17563, 17564
), class = "Date"), prod1Quantity = 1:4, prod2Quantity = 10:13), class = "data.frame", row.names = c(NA, 
-4L))
#    thisDate prod1Quantity prod2Quantity
#1 2018-01-01             1            10
#2 2018-01-02             2            11
#3 2018-02-01             3            12
#4 2018-02-02             4            13
票数 0
EN

Stack Overflow用户

发布于 2018-04-28 18:14:40

通过计算月份的生产量,再加入month of lastMonththisDate,就可以得到解决的方法。

lubridate::month函数已被用于评估自日期起的月份。

代码语言:javascript
复制
library(dplyr)
library(lubridate)
df %>% group_by(month = as.integer(month(thisDate))) %>%
  summarise(prodQuantMonth = sum(prod1Quantity)) %>%
  right_join(., mutate(df, prevMonth = month(lastMonth)), by=c("month" = "prevMonth")) %>%
  select(thisDate, lastMonth, prod1Quantity, prodQuantLastMonth = prodQuantMonth)

# # A tibble: 4 x 4
#   thisDate   lastMonth  prod1Quantity prodQuantLastMonth
#   <date>     <date>             <int>              <int>
# 1 2018-01-01 2017-12-01             1                 NA
# 2 2018-01-02 2017-12-01             2                 NA
# 3 2018-02-01 2018-01-01             3                  3
# 4 2018-02-02 2018-01-01             4                  3
票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/50078857

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档