我需要将原始数据与R中的数据框合并多个月,例如:日期时间的数据框包括2017年和2018年。
function ExampleGraph() {
const xKey = this.props.x;
const yKey = this.props.y;
const xyData = data.map(r => ({x: r[xKey], y: r[yKey]}));
const xDomain = data.reduce((res, row) => {
return {max: Math.max(res.max, row[xKey]), min: Math.min(res.min, row[xKey])};
}, {min: Infinity, max: -Infinity});
return (
<XYPlot
xDomain={[xDomain.max, xDomain.min]}
width={1000}
height={640}>
<HorizontalGridLines />
<LineSeries data={xyData} />
<XAxis />
<YAxis />
</XYPlot>
)
}
我想要的是根据6个月的时间和类别求和:
date category amt
1 2017-08-05 A 0.1900707
2 2017-08-06 B 0.2661277
3 2017-08-07 c 0.4763196
4 2017-08-08 A 0.5183718
5 2017-08-09 B 0.3021019
6 2017-08-10 c 0.3393616
我做了什么: 1.选择2017年的最后6个月,如明智的2018年 2.为每个子集添加一个新列以指示周期 3.再次组合2个子集 聚合 如下:
period category sum
1 2017_secondPeriod A 25.00972
2 2018_firstPeriod A 25.59850
3 2017_secondPeriod B 24.96924
4 2018_firstPeriod B 24.79649
5 2017_secondPeriod c 20.17096
6 2018_firstPeriod c 27.01794
我试图找出但不知道如何汇总多个月,例如3个月或6个月。
提前致谢 任何建议?
答案 0 :(得分:1)
使用lubridate和tidyverse(dplyr&amp; magrittr)
首先,让我们使用Semesters,Quarter和&#34; Trimonthly&#34;创建小组。
library(tidyverse)
library(lubridate)
df <- df %>% mutate(Semester = semester(date, with_year = TRUE),
Quarter = quarter(date, with_year = TRUE),
Trimonthly = round_date(date, unit = "3 months" ))
Lubridate的学期()由semsters打破并给你1(1月至6月)或2(7月至8月); quarter()与宿舍做类似的事情。 我添加了第三个更基本的round_date函数,您可以在其中以大小和时间单位的形式指定时间范围。它产生了这种时间范围的第一个日期。我刻意将其命名为“Trimonthly&#34;所以你可以看到它与quarter()的比较
Pivot.Semester <- df %>%
group_by(Semester, category) %>%
summarise(Semester.sum = sum(amt))
Pivot.Quarter <- df %>%
group_by(Quarter, category) %>%
summarise(Quarter.sum = sum(amt))
Pivot.Trimonthly <- df %>%
group_by(Trimonthly, category) %>%
summarise(Trimonthly.sum = sum(amt))
Pivot.Semester
Pivot.Quarter
Pivot.Trimonthly
可选:如果要将汇总数据加入原始DF。
df <- df %>% left_join(Pivot.Semester, by = c("category", "Semester")) %>%
left_join(Pivot.Quarter, by = c("category", "Quarter")) %>%
left_join(Pivot.Trimonthly, by = c("category", "Trimonthly"))
df
答案 1 :(得分:0)
这是一个不使用包的3行解决方案。让k
为一段时间内的月数。半年期间k
为6.对于四分之一年期间,k
将为3,等等。如果您想要一位数字,则将sprintf
格式的02替换为1(但不是每月一次)因为那些必须是两位数)。如果您希望它与问题完全匹配,请进一步修改sprintf
格式。
k <- 6
period <- with(as.POSIXlt(DF$date), sprintf("%d-%02d", year + 1900, (mon %/% k) + 1))
aggregate(amt ~ category + period, DF, sum)
,并提供:
category period amt
1 A 2017-02 0.7084425
2 B 2017-02 0.5682296
3 c 2017-02 0.8156812
以使用一个软件包为代价,我们可以通过用以下方法之一替换period
的公式来简化季度和月度计算:
library(zoo)
# quarterly
period <- as.yearqtr(DF$date)
# monthly
period <- as.yearmon(DF$date)
注意:可重复形式的输入是:
Lines <- "date category amt
1 2017-08-05 A 0.1900707
2 2017-08-06 B 0.2661277
3 2017-08-07 c 0.4763196
4 2017-08-08 A 0.5183718
5 2017-08-09 B 0.3021019
6 2017-08-10 c 0.3393616"
DF <- read.table(text = Lines)
DF$date <- as.Date(DF$date)