使用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