Warning: file_get_contents(/data/phpspider/zhask/data//catemap/1/typescript/8.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
使用data.table在R中创建开发图_R_Data.table - Fatal编程技术网

使用data.table在R中创建开发图

使用data.table在R中创建开发图,r,data.table,R,Data.table,我希望创建一个开发图,如下所示。首先让我向您介绍数据集: library(lubridate) test_data <- data.table( RunDate = c("2019-12-31", "2019-12-31", "2019-12-31", "2019-12-31", "2018-12-31", "2018-12-31", &q

我希望创建一个开发图,如下所示。首先让我向您介绍数据集:

library(lubridate)
test_data <- data.table(
  RunDate = c("2019-12-31", "2019-12-31", "2019-12-31", "2019-12-31",
              "2018-12-31", "2018-12-31", "2018-12-31", "2018-12-31", "2018-12-31", "2018-12-31",
              "2017-12-31", "2017-12-31", "2017-12-31", "2017-12-31", "2017-12-31", "2017-12-31"),
  ID = c(1, 2, 7, 8,
         1, 2, 4, 5, 6, 9,
         1, 2, 3, 4, 5, 6),
  Value = c(90, 43, 51, 99,
            100, 23, 52, 43, 14, 41,
            91, 131, 41, 12, 51, 11),
  IrrelevantColumn = c(1, 421, 321, 12, 43, 767, 42, 34, 12, 55, 22, 42)
)

inputDates <- "RunDate"
inputID <- "ID"
inputValues <- "Value"

然而,问题是,我希望每年都这样做,但目前我首先拆分这两年的data.table,然后在ID上合并它们,如果我们有很多年的时间,这不是很有效。我想知道我们是否可以在data.table中更有效地实现这一点。

刚刚意识到,我基本上是按照您在问题末尾所说的方法来实现的

library(data.table)
test_data <- data.table(
  RunDate = c("2019-12-31", "2019-12-31", "2019-12-31", "2019-12-31",
    "2018-12-31", "2018-12-31", "2018-12-31", "2018-12-31",
    "2017-12-31", "2017-12-31", "2017-12-31", "2017-12-31", "2017-12-31", "2017-12-31"),
  ID = c(1, 2, 7, 8,
    4, 5, 6, 9,
    1, 2, 3, 4, 5, 6),
  Value = c(90, 43, 51, 99,
    52, 43, 14, 41,
    91, 131, 41, 12, 51, 11)
  )

rundates <- sort(unique(test_data[,RunDate]))
rundates_map <- shift(rundates)
names(rundates_map) <- rundates

x <- merge(
  test_data[,.(RunDate = rundates_map[RunDate], ID, addition = Value)][!is.na(RunDate)],
  test_data[,.(RunDate, ID, subtraction = -Value)],
  by = c('RunDate','ID'),
  all = TRUE
)
y <- x[, .(
  In = sum(ifelse(is.na(subtraction), addition, 0)),
  Out = sum(ifelse(is.na(addition), subtraction, 0)),
  Increase = as.numeric(sum(ifelse(addition+subtraction > 0, addition+subtraction, 0), na.rm = TRUE)),
  Decrease = as.numeric(sum(ifelse(addition+subtraction < 0, addition+subtraction, 0), na.rm = TRUE))
), .(RunDate)]

melt(y,'RunDate', c('In', 'Out', 'Increase', 'Decrease'), 'Movement', 'Value')[order(RunDate)]
#>        RunDate Movement Value
#>  1: 2017-12-31       In    41
#>  2: 2017-12-31      Out  -263
#>  3: 2017-12-31 Increase    43
#>  4: 2017-12-31 Decrease    -8
#>  5: 2018-12-31       In   283
#>  6: 2018-12-31      Out  -150
#>  7: 2018-12-31 Increase     0
#>  8: 2018-12-31 Decrease     0
#>  9: 2019-12-31       In     0
#> 10: 2019-12-31      Out  -283
#> 11: 2019-12-31 Increase     0
#> 12: 2019-12-31 Decrease     0
库(data.table)
测试数据4:2017-12-31减少-8
#>5:2018-12-31第283页
#>6:2018-12-31出局-150
#>7:2018-12-31增加0
#>8:2018-12-31减少0
#>9:2019-12-31在0
#>10:2019-12-31出局-283
#>11:2019-12-31增加0
#>12:2019-12-31减少0

文字与数据不匹配,但我想我明白了。有一个问题,如果有人走了,他们能晚一点回来吗?是的,这是完全可能的。啊,是的,但你做得更好,因为我每两年拆分两个数据表!不过,我确实有一个小问题,作为我之前问题的延伸。是否可以不使用
year-1
,而是使用一种方法来选择数据集以前的“日期值”呢?是的,我刚刚更改了它。这有点复杂,您会丢失2016年的更改(除非您在
rundates\u映射中添加一个额外的日期)。
library(data.table)
test_data <- data.table(
  RunDate = c("2019-12-31", "2019-12-31", "2019-12-31", "2019-12-31",
    "2018-12-31", "2018-12-31", "2018-12-31", "2018-12-31",
    "2017-12-31", "2017-12-31", "2017-12-31", "2017-12-31", "2017-12-31", "2017-12-31"),
  ID = c(1, 2, 7, 8,
    4, 5, 6, 9,
    1, 2, 3, 4, 5, 6),
  Value = c(90, 43, 51, 99,
    52, 43, 14, 41,
    91, 131, 41, 12, 51, 11)
  )

rundates <- sort(unique(test_data[,RunDate]))
rundates_map <- shift(rundates)
names(rundates_map) <- rundates

x <- merge(
  test_data[,.(RunDate = rundates_map[RunDate], ID, addition = Value)][!is.na(RunDate)],
  test_data[,.(RunDate, ID, subtraction = -Value)],
  by = c('RunDate','ID'),
  all = TRUE
)
y <- x[, .(
  In = sum(ifelse(is.na(subtraction), addition, 0)),
  Out = sum(ifelse(is.na(addition), subtraction, 0)),
  Increase = as.numeric(sum(ifelse(addition+subtraction > 0, addition+subtraction, 0), na.rm = TRUE)),
  Decrease = as.numeric(sum(ifelse(addition+subtraction < 0, addition+subtraction, 0), na.rm = TRUE))
), .(RunDate)]

melt(y,'RunDate', c('In', 'Out', 'Increase', 'Decrease'), 'Movement', 'Value')[order(RunDate)]
#>        RunDate Movement Value
#>  1: 2017-12-31       In    41
#>  2: 2017-12-31      Out  -263
#>  3: 2017-12-31 Increase    43
#>  4: 2017-12-31 Decrease    -8
#>  5: 2018-12-31       In   283
#>  6: 2018-12-31      Out  -150
#>  7: 2018-12-31 Increase     0
#>  8: 2018-12-31 Decrease     0
#>  9: 2019-12-31       In     0
#> 10: 2019-12-31      Out  -283
#> 11: 2019-12-31 Increase     0
#> 12: 2019-12-31 Decrease     0