我有一个非常大的数据框(大约1GB和100万行),从上午10点到下午4点观察 . 我想用geom_step绘制一些图,它们在1:00:00-1:00:05pm完全放大,所以我认为为了节省RAM和时间,原始数据的子集会更快 . (而不是绘制所有内容并在之后放大) . 不幸的是,绘制一切都不是一个选择 . 由于我正在使用geom_step,我需要使用前后值包装我的子集,否则事情无法正确绘制 .
这是一个示例数据集实际上比我的数据小得多,但原理在那里:
set.seed(2)
c1 <- sort( sample(round(runif(10,1,10)*10), 10 , replace = TRUE ) )
c2 <- sample(c("A", "C", "T"), 10, replace = TRUE)
c4 <- round(runif(10)*1000)
d1 <- c(5, 12, c1, 96, 97, 98, 100)
d2 <- c("B", "C", c2, "B", "T", "T", "A")
d3 <- c(300, 400, c4, 200, 300, 300, 100)
dcat2 <- c(sample(1:2, 14, replace = TRUE), 1,1)
mydat <- data.frame(time = d1, category = d2, category2 = dcat2 , inventory = d3)
print(mydat)
# time category category2 inventory
# 1 5 B 2 300
# 2 12 C 1 400
# 3 27 C 1 10
# 4 52 C 1 165
# 5 59 T 2 810
# 6 62 A 2 869
# 7 62 C 2 514
# 8 73 C 1 627
# 9 85 A 2 844
# 10 95 C 2 285
# 11 95 T 1 667
# 12 95 A 1 150
# 13 96 B 2 200
# 14 97 T 2 300
# 15 98 T 1 300
# 16 100 A 1 100
require(ggplot2)
p <- ggplot(data=mydat, aes(x = time, y = inventory, group = category, col = category)) +
geom_step() +
facet_grid(.~category2)
print(p)
q <- ggplot(data=mydat, aes(x = time, y = inventory, group = category, col = category)) +
geom_step() +
facet_grid(.~category2) +
coord_cartesian(xlim = c(80,98))
print(q)
这个情节有效,但由于我的真实数据太大,所以需要永远绘制 . 我还希望假设步骤图在时间= 0时从零开始并保持它的最后一个值,直到时间= 100,而不是像在 p
和 q
中那样消失并且无处出现
以下更符合我的目的 . 它给出了一个错误,因此对于类别和类别2的每次交互,我需要用最近的观察(之前)包装 mydat.zoom
数据帧,并在 mydat.zoom
(之后)内进行最后一次观察
require(dplyr)
mydat.zoom <- filter(mydat, time >80, time < 98)
r <- ggplot(data=mydat.zoom, aes(x = time, y = inventory, group = category, col = category)) +
geom_step() +
facet_grid(.~category2)
print(r)
给出了一个错误,因为 geom_step
在facet中绘图时需要至少2个点,但其中一些已被子集切断到时间80和98之间 .
请建议一种有效的方法,找出每个因素,缩放窗口之前的最后一个观察,以及复制最后一个观察并将缩放窗口包装在这些中的方法(或不同的解决方案!)
2 回答
以下是我过去将观察结果带入正在检查的时间窗口的方法:
好的,这是一个黑客,但它可以帮助你暂时解决这个问题(即,直到有人提供更清洁的解决方案) .
这将创建一个临时变量,其中包含每个因子的出现次数 . 然后过滤结果以确保至少2个数据点 .
这样的事可能适合你 .
EDIT:
使用
dplyr
比上面的临时变量更好的解决方案 .