使用data.table将Year-to-date转换为Quarterly数据

时间:2016-11-03 14:49:33

标签: r data.table dplyr

来自数据提供商的季度数据存在的问题是,对于某些变量,季度数据值实际上是年初至今的数据。这意味着这些值是所有前几个季度的总和(Q2 = Q1 + Q2,Q3 = Q1 + Q2 + Q3,......)。 原始数据的结构如下所示:

#include <fstream>
#include <vector>
#include <string>
#include <iostream>
#include <algorithm>

using namespace std;

int main() {
    ifstream infile("input.txt"); // contains apple, orange, banana in separate lines
    istream_iterator<string> eos;
    istream_iterator<string> input(infile);
    const vector<string> stuff(input, eos);
    const vector<string> a_stuff(stuff.copy_if([](const string& s) { return s[0] == 'a'; }));

    return 0;
}

为了计算季度值,我需要从Q2,Q3和Q4中减去上一季度。 我使用 library(data.table) library(plyr) dt.quarter.test <- structure(list(Year = c(2000L, 2000L, 2000L, 2000L, 2001L, 2001L, 2001L, 2001L) , Quarter = c(1L, 2L, 3L, 4L, 1L, 2L, 3L, 4L) , Data.Year.to.Date = c(162, 405, 610, 938, 331, 1467, 1981, 2501)) , .Names = c("Year", "Quarter", "Data.Year.to.Date"), class = c("data.table", "data.frame"), row.names = c(NA, -8L)) 包中的ddply函数设法获得了预期的结果。

plyr

但我对命令并不满意,因为它看起来很笨拙,我想得到一些关于如何改进它的信息,特别是在data.table中直接做。

1 个答案:

答案 0 :(得分:0)

以下是data.table语法,您可能会发现data.table cheat sheet有用:

library(data.table)
dt.quarter.test[, Data.Quarterly := Data.Year.to.Date - shift(Data.Year.to.Date, fill = 0), Year][]    

#    Year Quarter Data.Year.to.Date Data.Quarterly
# 1: 2000       1               162            162
# 2: 2000       2               405            243
# 3: 2000       3               610            205
# 4: 2000       4               938            328
# 5: 2001       1               331            331
# 6: 2001       2              1467           1136
# 7: 2001       3              1981            514
# 8: 2001       4              2501            520